logo

[Python] 소멸자

 

소멸자(Destructor)란?

객체지향 프로그래밍에서 소멸자는 주로 객체 사용이 끝난 후, 객체가 메모리에서 제거되기 직전에 호출되는 특별한 메소드입니다. Python에서도 이 개념이 존재하며, __del__ 메소드를 통해 구현됩니다. 객체의 수명이 다하여 가비지 컬렉션에 의해 소멸될 때, Python은 자동으로 __del__ 메소드를 호출하여, 해당 객체가 사용하던 리소스의 정리나 필요한 마지막 작업을 수행할 수 있게 합니다.

 

소멸자의 목적

소멸자의 주된 두 목적은 리소스의 정리와 필요한 마지막 작업의 수행입니다.

  1. 리소스 정리: 프로그램 실행 도중, 객체는 파일, 네트워크 연결, 데이터베이스 연결 같은 다양한 외부 자원을 사용할 수 있습니다. 소멸자를 통해 이러한 자원들의 연결을 정상적으로 닫거나 해제할 수 있으며, 이는 리소스의 누수를 방지합니다.

  2. 필요한 마지막 작업 수행: 객체가 소멸되기 전에 로그를 기록하거나 객체의 최종 상태를 저장하는 등의 후처리 작업이 필요할 수 있습니다. 소멸자는 이러한 작업들을 안전하게 수행하는 장소를 제공합니다.

 

소멸자의 기본 형태와 사용법

소멸자는 __del__ 매직 메소드를 정의함으로써 클래스 내에 구현됩니다. 이 메소드는 파라미터를 받지 않으며, 객체가 소멸될 때 자동으로 호출됩니다.

class Example:
    def __init__(self):
        print("생성자 호출, 객체 생성")

    def __del__(self):
        # 소멸자 정의
        print("소멸자 호출, 객체 소멸")

# 객체 생성
ex = Example()

# 객체에 대한 마지막 참조를 제거
del ex

# 출력:
# 생성자 호출, 객체 생성
# 소멸자 호출, 객체 소멸

위의 코드 예제에서 객체 ex가 생성될 때 생성자가 호출되고, del ex 문을 통해 ex에 대한 참조가 제거될 때 소멸자가 호출됩니다. 여기서 중요한 점은 Python의 가비지 컬렉터는 객체에 대한 모든 참조가 소멸될 때 해당 객체를 메모리에서 제거하며, 이때 소멸자가 호출된다는 것입니다.

 

주의사항

  • 소멸자 내에서 예외가 발생하면, Python은 단지 이를 무시하고 프로그램은 계속 실행됩니다. 따라서 소멸자 내에서는 가능한 한 안정적인 로직만을 포함시키는 것이 중요합니다.
  • 객체의 삭제 시점을 정확히 예측하는 것은 어려울 수 있으며, 특히 순환 참조가 있는 경우 가비지 컬렉터의 작동 방식으로 인해 소멸자의 호출 시점이 예상과 다를 수 있습니다. 따라서 소멸자에 과도하게 의존하는 설계는 피하는 것이 좋습니다.

소멸자는 필요에 따라 자원의 해제나 중요한 마지막 작업을 수행하는 데 유용하게 사용될 수 있습니다. 그러나 리소스의 해제와 같은 중요한 작업은 가능한 명시적으로 처리하는 것이 좋으며, 소멸자는 정말 필요한 경우에만 사용해야 합니다.

Previous
생성자
Next
상속