방프리

17.6.13. Effective C++ 2. 생성자, 소멸자 및 대입 연산자 (항목7) 본문

C++/Effective C++

17.6.13. Effective C++ 2. 생성자, 소멸자 및 대입 연산자 (항목7)

방프리 2020. 1. 5. 00:10

항목 7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자.

 

이 주제를 시작하기에 앞서 다형성이란 무엇인지 먼저 살펴보겠습니다.

 

다형성이란? 객체지향(OOP) 다섯 가지 중 하나로 정의는 동일한 조작방법으로 동작시키지만

동작 방법은 다른 것이라고 할 수 있습니다. 

즉, 조작 인터페이스를 제공하는 부모 클래스를 만든 후 이 부모 클래스를 상속받는 자식 클래스를 통해 어떻게

조작할 것인지 정의해주는 것이죠 

정말 간편합니다. 부모클래스에 있는 하나의 메소드를 통해 자식클래스마다 각기 다른 행동을 나타낼 수 있기 때문이죠

하지만 이 편리한 기능에는 복병이 숨어있습니다. 바로! 자식클래스로 생성된 객체는 반드시 부모 클래스의 소멸자를

통해 마지막으로 소멸되기 때문입니다.

객체가 생성되고 소멸되는 과정은 부모생성자 -> 자식 생성자 -> 자식 소멸자 -> 부모 소멸자 로 진행됩니다.

이 모든 과정이 자동적으로 실행된다면 정말 편하지만 C++은 개발자들에게 편리한 툴이 아닙니다. 

이말은 즉, 객체가 소멸될 때 개발자가 부모 소멸자까지 호출하도록 정의를 해주어야 한다는 것이죠.

정말 간단합니다. 부모 클래스의 소멸자 앞에 virtual을 붙이면 되죠. virtual을 붙이는 순간 바로 자식클래스가 소멸되면 

부모클래스의 소멸자까지 같이 호출이 됩니다. 

사실 가상 함수를 C++에서 구현한다면 각 클래스는 어떠한 함수를 호출할 포인터를 가지고 있어야 합니다. 이것을 

가상 함수의 경우엔 vptr[가상함수테이블 포인터]로 가지고 있습니다. 

(이것은 예로 든 것이고 vptr은 구현이 거의 불가능하다고 생각하시면 됩니다.)

결국 메모리의 낭비를 보고 싶지 않다면 반드시 가상 소멸자 앞에는 virtual을 붙이는 것이 좋습니다.

 

이것만은 잊지 말자!

 

* 다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 합니다. 즉, 어떤 클래스가 가상 함수를 하나라도 갖고

있으면, 이 클래스의 소멸자도 가상 소멸자이어야 합니다.

* 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상 소멸자를 선언하지 말아야 합니다.

Comments