파이썬 소멸자 정리 (__del__)
1. 소멸자란?
- 객체가 삭제되거나 참조 카운트가 0이 되어 메모리에서 해제될 때 자동으로 호출되는 메서드
- 자원 정리(파일 닫기, 네트워크 연결 종료 등)에 사용
2. 기본 형태
class MyClass:
def __del__(self):
print("객체가 삭제됩니다.")
- 메서드 이름은 반드시
__del__
이어야 함 self
는 현재 인스턴스를 가리킴
3. 사용 예시
class FileHandler:
def __init__(self, filename):
self.file = open(filename, 'w')
print("파일 열림")
def __del__(self):
self.file.close()
print("파일 닫힘")
f = FileHandler("test.txt")
del f # 명시적으로 삭제
4. 동작 타이밍
- 객체가 소멸할 때 호출되지만, 정확한 시점은 보장되지 않음
- 주로 참조 카운트가 0일 때 실행되지만,
gc
(garbage collector)가 동작하는 방식에 따라 지연될 수 있음- 특히 **순환 참조(circular reference)**가 있을 경우 실행되지 않을 수 있음
5. 강제 소멸
del 객체명
- 객체를 명시적으로 삭제 가능
- 단, 다른 곳에서 여전히 참조하고 있으면
__del__
은 호출되지 않음
6. 주의사항
주의점 | 설명 |
---|---|
예외 처리 어려움 |
내부에서 예외가 발생해도 무시됨 (경고만 출력) |
순환 참조 |
이 정의된 객체가 순환 참조되면 소멸되지 않을 수 있음 |
객체 존재 여부 | 소멸 시점에는 다른 속성이나 변수들이 이미 사라졌을 수 있음 →
주의 |
7. 좋은 사용 사례
- 파일, 소켓, DB 연결 등 시스템 자원 해제 시 유용
- 그러나 일반적으로는
with
문 같은 컨텍스트 매니저(__enter__
,__exit__
)를 권장함
8. 대안: with
문 사용
with open("file.txt", "w") as f:
f.write("안녕하세요")
# 자동으로 파일 닫힘