Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 소멸자(Destructor)란? 개념부터 예제까지 완벽 정리

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();

프로그램의 전체 실행 흐름을 정리하면 다음과 같습니다.

  1. 객체 obj1이 생성되는 순간 생성자가 호출되어 "생성자 실행"이 출력됩니다.
  2. display() 함수가 호출되어 num1과 num2의 값이 차례대로 출력됩니다.
  3. main() 함수가 종료되면 객체 obj1이 범위를 벗어나므로 소멸자가 자동으로 호출되어 "소멸자 실행"이 출력됩니다.