산타는 없다

상속 시 생성자와 소멸자 실행순서, 그리고 주의할 점 본문

Programming Language/C++

상속 시 생성자와 소멸자 실행순서, 그리고 주의할 점

LEDPEAR 2021. 8. 17. 22:51
반응형

C++에서 클래스의 상속은 객체 지향 언어의 목적인 코드의 재사용성을 높여줍니다.

예를 들어 과일 클래스와 사과, 바나나 클래스가 있을 경우

과일이 가지고 있는 특징을 과일 클래스에 정의하고

사과와 바나나는 과일 클래스를 상속받아 이미 작성된 과일의 특징을 다시 작성하지 않고 그대로 사용할 수 있습니다.


이런 상속에서 기초 클래스와 파생 클래스의 생성자, 소멸자의 실행 순서를 알아보겠습니다.

결론부터 말하면

생성자 : 기초 -> 파생

소멸자 : 파생 -> 기초

순서로 실행됩니다.


생성자 : 기초 -> 파생

정확히 말하면 파생 클래스를 선언이 될 때 기초 클래스의 생성자가 실행이 되고 그다음 파생 클래스의 생성자가 실행이 됩니다.

그 이유는 파생 클래스의 객체를 생성할 때, 먼저 기초 클래스의 객체를 생성합니다. C++은 이것을 하기 위해 멤버 초기자 리스트[ 파생 클래스 생성자(매개변수) : 기초 클래스(매개변수)]를 사용하며 기초 클래스 생성자에 기초 클래스 정보를 제공합니다.

파생 클래스의 객체를 생성하기 전에 기초 클래스의 객체를 생성하기 때문에 기초 클래스의 생성자가 실행이 되고 난 뒤 파생 클래스의 생성자가 실행이 됩니다.


소멸자 : 파생 -> 기초

소멸자는 생성자와 반대로 파생 클래스의 소멸자가 실행된 뒤 기초 클래스의 소멸자가 실행됩니다.

파생 클래스의 객체가 수명이 다했을 때, 프로그램은 먼저 파생 클래스의 소멸자를 호출하고 그다음에 기초 클래스의 소멸자를 호출하기 때문입니다.


주의할 점

여기서 주의할 점은 생성자는 멤버 초기자 리스트를 통해 무조건 기초 클래스의 생성자가 실행되지만 소멸자는 그렇지 않을 수 있다는 점입니다.

프로그램이 소멸자를 호출하는데 만약

기초 클래스_자료형 * 변수명 = new 파생 클래스_자료형();

위와 같이 선언하였을 때 기초 클래스의 소멸자를 가상 소멸자로 선언하지 않았다면, 해당 객체 delete 했을 때 프로그램은 파생 클래스의 소멸자만 실행하게 된다.

이는 가상 함수와 사용하는 것과 마찬가지인 이유로, 오버라이드 시 virtual을 사용하지 않은 경우에 프로그램은 참조형이나 포인터형에 기초하여 메서드를 선택하기 때문입니다.

때문에 위와 같은 경우에서 virtual이 붙은 함수는 파생 클래스에서 재정의한 함수가 호출되고 붙지 않았다면 기초 클래스의 함수가 호출됩니다.

소멸자도 마찬가지로 virtual을 붙여줘야 파생 클래스의 소멸자를 호출하게 되고, 그 뒤 자동으로 기초 클래스의 소멸자가 호출됩니다.

단 이것은 new로 객체를 생성했을 때의 경우에 나타나는 현상이므로, 그냥 객체를 생성했을 땐 virtual을 붙여주지 않아도 파생 -> 기초 순으로 소멸자가 호출됩니다.

반응형

'Programming Language > C++' 카테고리의 다른 글

오버라이딩(재정의) 시 주의사항  (0) 2021.08.17
C++ 소스 코드 빌드 과정  (0) 2021.08.02
Comments