C++에서 소멸자(Destructor)는 객체를 메모리에서 해제(소멸)하는 역할을 담당하는 클래스의 멤버 함수입니다. 소멸자는 함수가 종료되거나, 프로그램이 끝나거나, delete 연산자가 호출되는 등 클래스 객체가 선언된 범위(scope)를 벗어나는 시점에 자동으로 호출됩니다.
소멸자는 일반 멤버 함수와 달리 어떠한 매개변수도 받지 않고, 반환값도 없습니다. 또한 소멸자의 이름은 반드시 클래스 이름과 동일해야 하며, 이름 앞에 물결표(~) 기호가 붙는 것이 특징입니다.
소멸자의 주요 특징
- 클래스 이름 앞에 틸드(~)를 붙여
~클래스명()형태로 정의합니다. - 매개변수와 반환값이 없기 때문에 오버로딩할 수 없습니다.
- 객체의 수명이 끝나는 시점에 컴파일러에 의해 자동으로 호출됩니다.
- 하나의 클래스에는 하나의 소멸자만 존재할 수 있습니다.
- 동적으로 할당한 메모리 해제 등 리소스 정리 작업에 유용하게 활용됩니다.
다음은 C++에서 소멸자의 동작 방식을 보여주는 예제 프로그램입니다.
예제 코드
#include<iostream>
using namespace std;
class Demo {
private:
int num1, num2;
public:
Demo(int n1, int n2) {
cout << "생성자 실행" << endl;
num1 = n1;
num2 = n2;
}
void display() {
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
}
~Demo() {
cout << "소멸자 실행";
}
};
int main() {
Demo obj1(10, 20);
obj1.display();
return 0;
}
실행 결과
생성자 실행 num1 = 10 num2 = 20 소멸자 실행
코드 분석
위 프로그램에서 Demo 클래스는 매개변수가 있는 생성자를 포함하고 있으며, 이 생성자는 전달받은 값 n1과 n2를 사용해 멤버 변수 num1과 num2를 초기화합니다. 또한 num1과 num2의 값을 화면에 출력하는 display() 함수도 함께 정의되어 있습니다.
특히 주목해야 할 부분은 ~Demo() 형태로 정의된 소멸자입니다. 이 소멸자는 main() 함수가 종료되면서 obj1 객체가 범위를 벗어나는 순간 자동으로 호출됩니다. 해당 클래스 코드는 다음과 같습니다.
class Demo {
private:
int num1, num2;
public:
Demo(int n1, int n2) {
cout << "생성자 실행" << endl;
num1 = n1;
num2 = n2;
}
void display() {
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
}
~Demo() {
cout << "소멸자 실행";
}
};
main() 함수에는 Demo 클래스 타입의 객체 obj1을 생성하는 정의문이 포함되어 있으며, 이어서 display() 함수를 호출해 멤버 변수의 값을 출력합니다.
Demo obj1(10, 20); obj1.display();
프로그램의 전체 실행 흐름을 정리하면 다음과 같습니다.
- 객체 obj1이 생성되는 순간 생성자가 호출되어 "생성자 실행"이 출력됩니다.
- display() 함수가 호출되어 num1과 num2의 값이 차례대로 출력됩니다.
- main() 함수가 종료되면 객체 obj1이 범위를 벗어나므로 소멸자가 자동으로 호출되어 "소멸자 실행"이 출력됩니다.