Computer Science/C & C++

[C++] Class Destructor | 클래스 파괴자

lww7438 2020. 2. 26. 15:02

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 (디폴트 파괴자)

- 프로그래머가 파괴자를 따로 정의해놓지 않은 경우, (생성자의 경우와 마찬가지로)컴파일러는 정의부가 비어있는 디폴트 파괴자를 자동으로 정의하게 된다.