소멸자(消滅者, destructor)는 객체 지향 프로그래밍에서 객체의 수명이 다하여 메모리에서 해제될 때 자동으로 호출되는 특수한 멤버 함수를 가리키는 용어이다. 주로 C++ 언어에서 클래스의 인스턴스가 소멸되는 시점에 필요한 정리 작업을 수행하기 위해 사용된다.
주요 특징
- 자동 호출: 객체가 스코프(scope)를 벗어나거나
delete연산자에 의해 동적 할당이 해제될 때 컴파일러에 의해 자동으로 호출된다. - 이름 규칙: 클래스 이름 앞에 물결표(~)를 붙인 형태(예:
~ClassName())로 선언하며, 반환 타입을 가지지 않고 매개변수도 전달받을 수 없다. - 단일성: 한 클래스에는 오직 하나의 소멸자만 정의할 수 있다(오버로딩 불가능).
- 가상 소멸자: 다형성을 이용해 기본 클래스 포인터로 파생 클래스 객체를 삭제할 때 파생 클래스의 소멸자가 정상적으로 호출되도록 하기 위해, 기본 클래스의 소멸자를
virtual로 선언하는 것이 일반적이다.
역할 소멸자의 주된 목적은 객체 생성 시 할당된 자원(동적 메모리, 파일 핸들, 네트워크 소켓, 락 등)을 해제하여 자원 누수(resource leak)를 방지하는 것이다. 이를 통해 RAII(Resource Acquisition Is Initialization) 패턴의 구현이 가능하다.
타 언어와의 비교
- C++: 결정적 소멸(deterministic destruction)을 지원하며, 프로그래머가 소멸자를 명시적으로 구현하여 자원 해제 시점을 제어한다.
- Java, C#, Python 등: 가비지 컬렉션(Garbage Collection) 방식을 사용하므로 C++ 식의 결정적 소멸자는 존재하지 않는다. 대신
finalize()(Java), 소멸자/파이널라이저(C#),__del__(Python) 등이 있으나, 호출 시점이 비결정적이며 자원 해제용으로는try-with-resources,using,with문 등 명시적 패턴을 권장한다.