Skip to main content

파이썬 소멸자 정리 (__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. 주의사항

주의점

설명

예외 처리 어려움

__del__

내부에서 예외가 발생해도 무시됨 (경고만 출력)

순환 참조

__del__

이 정의된 객체가 순환 참조되면 소멸되지 않을 수 있음

객체 존재 여부

소멸 시점에는 다른 속성이나 변수들이 이미 사라졌을 수 있음 →

AttributeError

주의

7. 좋은 사용 사례

  • 파일, 소켓, DB 연결 등 시스템 자원 해제 시 유용
  • 그러나 일반적으로는 with 문 같은 컨텍스트 매니저(__enter__, __exit__)를 권장함

8. 대안: with 문 사용

with open("file.txt", "w") as f:
    f.write("안녕하세요")
# 자동으로 파일 닫힘