Class Destructor
클래스 파괴자
- 객체의 수명이 다하는 시점에 프로그램이 실행시키는 특별한 메서드이다.
- Class Constructor(클래스 생성자)와 반대되는 기능을 하는 메서드이다.
Destructor Definition (파괴자 정의)
- 파괴자는 별도의 리턴형을 가지지 않는다. (\(\texttt{void}\)형에도 해당되지 않는다.)
- 파괴자의 이름은 \(\sim\) Operator (Tilde Operator) 을 클래스 이름 앞에 붙이는 것으로 고정된다.
- 파괴자는 생성자와 달리, 매개변수를 가져서는 안된다.
(즉, 파괴자는 이름이 고정되어 있고, 매개변수를 가져서는 안되므로 한 클래스에 딱 하나만 존재하게 된다.)
// Ex. 파괴자 정의 예시
class Stock {
private:
...
public:
Stock() {...} // 인라인 함수로 정의되는 디폴트 생성자
~Stock(); // 파괴자는 클래스명 앞에 Tilde 연산자가 붙는다.
...
};
Stock::Stock() {...} // 파괴자가 수행하는 작업을 기술한다.
Using Destructor (파괴자 응용)
- 파괴자는 어떤 객체가 수명을 다할 때 자동으로 호출되므로, 생성자와는 다르게 사용자가 명시적으로 호출하면 안된다.
- 생성자가 \(\texttt{new}\)를 통해 동적으로 메모리를 할당받는 작업을 수행한다면, 파괴자는 \(\texttt{delete}\) 연산을 수행하게 하는 것이 일반적인 파괴자 응용 사례이다.
- 동적 할당을 수행하는 생성자들은 \(\texttt{new}\) 혹은 \(\texttt{new []}\) 둘 중 하나로 일괄적으로 통일시켜야 파괴자가 일률적으로 메모리를 해제 시킬 수 있다.
- 반드시, \(\texttt{new}\)에는 \(\texttt{delete}\)로, \(\texttt{new []}\)에는 \(\texttt{delete []}\) 로 짝을 이루어야 한다.
- 파괴자는 단 한 가지 버전만 정의할 수 있다. 이 말은, 파괴자가 \(\texttt{delete}\) 연산 또는 \(\texttt{delete []}\) 연산을 수행한다면, 모든 생성자에 \(\texttt{new}\) 연산자 혹은 \(\texttt{new []}\)가 있어야 함을 의미한다.
(\(\texttt{new []}\)를 이용할 것이 권장된다. \(\texttt{[ ]}\)를 포함하는 것이 더 큰 범주에 속하기 떄문이다. 하나의 객체를 동적으로 할당할 때에는 \(\texttt{new [1]}\) 표기를 사용하면 되기 때문이다.)
- \(\texttt{new}\)를 이용할 필요가 없는 생성자에서는 \(\texttt{nullptr}\) 와 같이, 객체를 NULL 포인터로 초기화 해놓는 것도 좋은 방법이다. NULL 포인터에 \(\texttt{delete}\) 연산을 적용할 수 있기 때문이다.
// Ex. 파괴자 응용 예시
#define SIZE 5
class Stock {
private:
string m_company;
int* m_shares;
double m_share_val;
public:
Stock(string&, int, double);
~Stock();
}
Stock::Stock(string& co, int* sh, double sh_v) {
cin >> co;
sh = new int[SIZE];
sh_v = 0.0;
}
Stock::~Stock() {
delete [] sh;
}
Default Destructor (디폴트 파괴자)
- 프로그래머가 파괴자를 따로 정의해놓지 않은 경우, (생성자의 경우와 마찬가지로)컴파일러는 정의부가 비어있는 디폴트 파괴자를 자동으로 정의하게 된다.