생성자와 함께 이해하면 좋다. 생성자와 유사한 점도 있고, 생성자와 함께 생각할 점도 있기 때문이다.
소멸자(destructor)
객체 생성은 메모리 할당, 멤버 이니셜라이저를 통한 초기화, 생성자 호출의 과정으로 이루어진다고 전에 설명하였다. 이번에는 생성한 객체를 없애는 역할을 하는 소멸자에 대해서 알아보자. 객체 생성 시 반드시 호출되는 것이 생성자라면, 객체 소멸 시 반드시 호출되는 것이 소멸자이다. 참고로 전에 언급하였듯이 malloc(), free() 함수를 이용한 동적 할당으로는 생성자와 소멸자가 호출되지 않는다. malloc()으로 동적 할당한 객체는 그래서 초기화 과정을 거치지 않으면 쓰레기값이 멤버변수에 들어간다.
소멸자는 다음과 같은 형태이다.
간단하다. 생성자와는 달리 함수 오버로딩이 불가능하다. 소멸자는 생성자와 마찬가지로 생성자가 정의되지 않으면 디폴트 소멸자가 자동으로 삽입된다.
소멸자는 어떤 역할을 하는가? 소멸자는 객체 생성 시 할당된 메모리 반환하는 역할을 한다. 객체를 생성하기 위해서 할당한 메모리를 반환하는 것은 당연히 필요한 일이다. 그러면 이런 경우를 생각해보자. 생성자를 통해 객체를 생성하는데, 생성자 내부에서 문자열을 저장하기 위해 동적 할당을 하였다. 객체는 소멸자를 호출하여 메모리를 반환하면 된다. 문자열을 위한 메모리 공간은 어떻게 반환할 것인가? 다음 코드는 이 상황을 보여주고 있다.
Person이라는 클래스의 생성자를 보면 문자열 배열을 new 연산자를 통해 동적 할당하고 있다. 이 클래스를 통해 생성한 객체를 소멸시킬 때, 이 문자열 배열도 함께 소멸시켜야 메모리 누수(memory leak)가 발생하지 않는다. 문자열 배열은 언제 소멸시키는 것이 가장 좋겠는가? 객체가 사라질 때 함께 소멸시키는 것이 가장 좋을 것이다. 위 코드는 문자열 배열에 대한 메모리 해제가 이루어지고 있지 않다. 객체를 소멸시키면 메모리 누수가 발생한다. 그럼 수정해보자. 간단하다.
생성자에서 동적 할당한 메모리를 소멸자에서 해제시켜주면 된다. 다만 배열의 형태로 동적 할당하였으므로 delete []name; 형태로 메모리를 해제시켜주어야 한다는 점만 주의하면 된다.
상속의 개념이 적용되지 않은 상태에서 소멸자에 대한 내용은 이 정도이다. 소멸자는 상속과 virtual의 개념을 적용하여 다시 설명할 것이다. 지금은 이 정도로 간단하게 마무리하자.
댓글 없음:
댓글 쓰기