본문 바로가기
Programming/Python

23. 가비지 컬렉터(Garbage Collector)

by IT learning 2021. 3. 28.
728x90

파이썬으로 프로그래밍을 할 때는 프로그래밍 언어의 내부에서 일어나는 일들에 대해 크게 신경을 쓰지 않아도 된다.

 

그래도 어느정도는 알아두어야 하는 것이 있는데, 그 중 하나가 가비지 컬렉터이다.

 

프로그램 내부에서 무언가를 생성한다는 것은 메모리 위에 무언갈 올린다는 의미이다.

참고로 메모리가 부족해지면, 컴퓨터는 하드디스크의 일부를 메모리 처럼 사용하기도 한다.

이러한 동작을 스왑(Swap)이라고 하는데, 하드 디스크의 일부를 메모리 처럼 사용하면 원래 메모리보다 훨씬 느리므로 스왑을 처리하는 속도도 자연스레 느려진다.

 

여튼, 이게 핵심은 아니고.

 

프래그램에서 변수를 만들면 데이터가 메모리 위에 올라가고, 계속 만들다 보면 어떻게 될까? 어떻게 되긴, 메모리가 가득 찰것이다.

하지만, 파이썬에서는 가비지 컬렉터 라는 것이 있다.

가비지 컬렉터의 역할은 더 사용할 가능성이 없는 데이터를 메모리에서 제거 하는 역할을 한다.

 

그렇다면, 더 사용할 가능성이 없는 데이터란 무엇일까?

가장 대표적인건 변수에 저장되지 않는 데이터라던가, 함수 등에서 나오면서 변수를 활용할 수 없게 되는 경우 등이 있겠다.

# 가비지 컬렉터 : 변수에 저장하지 않은 경우
class Test:
    def __init__(self, name):
        self.name = name
        print("{} - 생성되었습니다.".format(self.name))
    def __del__(self):
        print("{} - 파괴되었습니다.".format(self.name))
        
Test("A")
Test("B")
Test("C")

# 이 테스트는 변수에 저장하지 않은 채로 실행되는 경우이다.
# 변수에 저장되지 않았을 경우에는 . 가비지 컬렉터는 이후에 활용하지 않겠다는 의미로 이해하고 메모리를 아끼기 위해 과감히 지워버린다.

위 코드를 살펴보자.

위 코드는 Test 라는 클래스를 열어 생성자소멸자가 선언되어있다.

그리고 생성된 클래스들은 변수에 저장되어 있지 않는 상태이다.

그렇다면 어떻게 결과가 나올까?

위 코드의 실행결과이다.

어떻게, 예상이 됐던 결과인가?

파이썬의 가비지 컬렉터로 인해 변수에 저장되어있지 않는 이유에서, 클래스를 생성하고 다음을 실행하기 전에 파괴를 하는 수순을 밟고 있다.

 

만약에 변수에 데이터를 넣으면 어떻게 될까?

# 가비지 컬렉터: 변수에 저장한 경우
class Test:
    def __init__(self, name):
        self.name = name
        print("{} - 생성되었습니다.".format(self.name))
    def __del__(self):
        print("{} - 파괴되었습니다.".format(self.name))
        
        
a = Test("A")
b = Test("B")
c = Test("C")

위 코드를 살펴보자.

이번에는 변수에 저장을 한 형태로 코드를 작성해봤다.

그럼 결과는 어떻게 나올까?

위 코드의 실행결과이다.

파이썬의 가비지 컬렉터는 변수에 저장했으면 나중에 쓸라고 저장한건가? 일단 나중에 지워야겠다. 라고 생각하고 프로그램이 종료되는 순간까지 데이터를 메모리에서 제거하지 않는다.

 

사실 C++이나 ,C의 경우 가비지 컬렉터가 없기 때문에 이런 생성하고 파괴하는 순서나, 의미를 알아야 하지만,

파이썬의 경우 알아서 가비지 컬렉터가 작동하기 때문에, 이렇게 돌아간다 라는 정도의 느낌만 알고 가면 좋다.

 

오늘은 가비지 컬렉터에 대해서 알아보았다.

728x90

'Programming > Python' 카테고리의 다른 글

25. 상속(Inheritance)  (0) 2021.03.28
24. 프라이빗 변수(Private Variable)와 게터 / 세터 (Getter / Setter)  (0) 2021.03.28
22. 클래스의 추가적인 구문  (0) 2021.03.27
21. 클래스  (0) 2021.03.26
20. 모듈 만들기  (0) 2021.03.25

댓글

IT_learning's Commit