..

Search

51) 소멸자

51) 소멸자

소멸자


소멸자(destructor)

C++에서 생성자는 객체 멤버의 초기화뿐만 아니라, 객체를 사용하기 위한 외부 환경까지도 초기화하는 역할을 합니다.

따라서 객체의 수명이 끝나면 생성자의 반대 역할을 수행할 멤버 함수도 필요해집니다.

이러한 역할을 하는 멤버 함수를 소멸자(destructor)라고 합니다.

소멸자는 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되며, 사용이 끝난 객체를 정리해 줍니다.

 

C++에서 클래스 소멸자의 이름은 해당 클래스의 이름과 같으며, 이름 앞에 물결 표시(tilde, ~)를 붙여 생성자와 구분합니다.

즉, Book 클래스의 소멸자는 ~Book()이라는 이름을 가지게 됩니다.

 

이러한 소멸자는 다음과 같은 특징을 가집니다.

 

1. 소멸자는 인수를 가지지 않습니다.

2. 소멸자는 반환값이 없지만 void형으로 선언하지 않습니다.

3. 객체는 여러 개의 생성자를 가질 수 있지만, 소멸자는 단 하나만 가질 수 있습니다.

4. 소멸자는 const, volatile 또는 static으로 선언될 수는 없지만, const, volatile 또는 static으로 선언된 객체의 소멸을 위해서 호출될 수는 있습니다.


소멸자의 선언

앞서 살펴본 Book 클래스의 소멸자 원형은 다음과 같습니다.

소멸자 원형

~Book();

 

위의 예제에서 클래스의 소멸자는 반환값이 없음에 주의합니다.

 

예를 들어 생성자에서 new 키워드를 이용해 동적으로 메모리를 할당했다면, 소멸자에서는 delete 키워드를 이용해 동적으로 할당받은 메모리를 반환해야 합니다.

그렇지 않으면 해당 프로그램에 메모리 누수(memory leak)가 계속해서 발생하게 될 것입니다.

 

앞서 살펴본 Book 클래스의 소멸자는 객체를 소멸하는 것 이외에는 실제로 수행할 작업이 없습니다.

소멸자 선언

Book::~Book() { }

 

클래스 소멸자의 원형은 클래스 선언의 public 영역에 포함되어야 합니다.

소멸자의 호출

C++에서 소멸자의 호출 시기는 컴파일러가 알아서 처리하게 됩니다.

C++에서 객체가 선언된 메모리 영역별로 소멸자가 호출되는 시기는 다음과 같습니다.

메모리 영역 소멸자 호출 시기
데이터(data) 영역 해당 프로그램이 종료될 때
스택(stack) 영역 해당 객체가 정의된 블록을 벗어날 때
힙(heap) 영역 delete를 사용하여 해당 객체의 메모리를 반환할 때
임시 객체 임시 객체의 사용을 마쳤을 때

 

예제

Book::~Book() // 소멸자의 선언

{

    // 프로그램이 종료될 때 컴파일러에 의해 자동으로 호출됨.

    cout << "Book 객체의 소멸자가 호출되었습니다." << endl;

}

코딩연습 ▶

실행 결과

0

Book 객체의 소멸자가 호출되었습니다.


연습문제