Python은 불필요한 객체(내장 유형 또는 클래스 인스턴스)를 자동으로 삭제하여 메모리 공간을 확보합니다. Python이 더 이상 사용하지 않는 메모리 블록을 주기적으로 해제하고 회수하는 프로세스를 Garbage Collection이라고 합니다.
Python의 가비지 수집기는 프로그램 실행 중에 실행되며 개체의 참조 횟수가 0에 도달하면 트리거됩니다. 개체의 참조 횟수는 개체를 가리키는 별칭 수가 변경됨에 따라 변경됩니다.
객체의 참조 횟수는 새 이름이 지정되거나 컨테이너(목록, 튜플 또는 사전)에 배치될 때 증가합니다. 개체의 참조 횟수는 del로 삭제되거나 참조가 재할당되거나 참조가 범위를 벗어날 때 감소합니다. 개체의 참조 횟수가 0에 도달하면 Python이 자동으로 수집합니다.
a = 40 # Create object <40> b = a # Increase ref. count of <40> c = [b] # Increase ref. count of <40> del a # Decrease ref. count of <40> b = 100 # Decrease ref. count of <40> c[0] = -1 # Decrease ref. count of <40>의 수
일반적으로 가비지 수집기가 분리된 인스턴스를 파괴하고 해당 공간을 회수할 때 이를 눈치채지 못할 것입니다. 그러나 클래스는 인스턴스가 파괴되려고 할 때 호출되는 소멸자라고 하는 특수 메서드 __del__()을 구현할 수 있습니다. 이 방법은 인스턴스에서 사용하는 비메모리 리소스를 정리하는 데 사용할 수 있습니다.
예시
이 __del__() 소멸자는 곧 파괴될 인스턴스의 클래스 이름을 출력합니다 -
#!/usr/bin/python class Point: def __init__( self, x=0, y=0): self.x = x self.y = y def __del__(self): class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point() pt2 = pt1 pt3 = pt1 print id(pt1), id(pt2), id(pt3) # prints the ids of the obejcts del pt1 del pt2 del pt3
출력
위의 코드를 실행하면 다음과 같은 결과가 나온다 -
3083401324 3083401324 3083401324 Point destroyed