프로그래밍/cpp

생성자와 소멸자 호출 C++

콘파냐 2013. 5. 9. 19:01
반응형

---------------Base

ㅁㅁㅁ----------Second

ㅁㅁㅁ--------Third

세개의 클래스가 위와같은 상속을 하고있다.

생성자에는 자신의 클래스명을 출력하고, 소멸자에는 ~클래스명을 출력하게 코드를 작성했다.

두가지 객체 생성 방법을 비교해보자.

CASE 1

Base *PB=new Base;
 cout<<endl;


Base *PB1=new Second;
 cout<<endl;


Base *PB2=new Third;

 

 

 

 

 

 

   Base a;
  Second b;
  Third c;

 

  Base *PB=&a;
   cout<<endl;
  Base *PB1=&b;
   cout<<endl;
  Base *PB2=&c;

 

 

왼편에는 Base의 포인터타입을 선언한후 new연산자로 객체 메모리를 할당하였다.

프로그램 종료시 소멸자(파괴자)는 호출되지않는다.

 

오른편의 경우 세개의 객체를 생성한후 PB포인터가 가르키게 한후 프로그램이 종료된 모양이다.

생성자의 호출은 객체 생성시 왼편과 동일하게 호출된다.

다만 소멸자의 호출이 자동으로 이루어진다는 점이 왼편과 다르다.

 

new에 대해 좀더 파해쳐보자.

new연산자는 c언어의 malloc 함수를 생각하면 된다. 메모리의 동적 할당을 위해 사용되던 함수다.

하지만 c++에선 new는 함수가아닌 키워드(연산자)다. 언어(컴파일러)차원에서 new를 다룬다.

 

위 실험에서처럼 왼편의 객체의 메모리공간을 리턴하는 객체생성방식과, 오른편 객체에 이름을 주어 생성후 그 객체의 주소값을 포인터 객체에 전달하는 방식의에는 차이점은 소멸자의 생성 유무인것이다.

그럼 왼편에 프로그램 종료시 메모리의 회수를 하기위해 delete PB 구문을 처리해줘야한다는 결론이 나온다.

new와 delete는 쌍이라고 생각하면 되겠다.

객체를 오른편과 같이 생성한 경우는 프로그램 종료시 소멸자가 자동으로 생성되었다.

그럼 다음 문장은 같은것이 된다.

 

Base PB;

PB.show();

 

 

Base *PB=new Base();

PB->show();

delete PB;

 

 

그런데 왼편의 쉬운 표현을 나두고 오른편의 문장을 써야하는 이유는 무엇일까.

그건 Call by Value, Call by reference 의 차이이다.

Call by Value는 값의 복사에의한 전달이고 Call by reference는 값의 참조에의한전달이다.

1.어떤 특정 객체의 값을 조작하기 위해서 객체를 함수에 전달할 경우 왼편처럼하게되면 함수내에서 객체의 값을 수정할 수 가 없게된다.

2. 값에복사에 의한 전달의 경우 메모리(스택)에 똑같은 객체를 또 생성하기때문에 메모리 사용이 많아진다.

그러므로 오른편같이 new키워드를 이용한 객체의 생성과 참조는 이 두가지 이점이 있게된다.

 

단 delete로 메모리관리를 수동으로 해주어야한다.

new 키워드의 경우 해당 클래스의  생성자를 호출해주고

delete 키워드의 경우 해당 클래스의 소멸자를 호출해준다.

 

그런데 우리는 멤버함수의virtual 키워드의 유무에 따라 위의 선언을 달리해야한다.

virtual 키워드는 마치 스위치같은 존재다.

virtual 키워드가 on이 되면 우리는 두가지 갈림길에서 오른편을 택해야하고

off되면 왼편을 택해야한다.

on이되면 동적 바인딩을 해야하고

off가 되면 정적 바인딩을 해야한다.

소멸자 또한 virtual 선언이 가능한데 함수가 vitual로 선언된경우 무조건 해주자.

virtual 선언은 다형성을 표현하기위한 c++의 언어적인 특성이고 오버라이딩을 효용성있게 해준다.

결국 virtual을 언제해야할까 고민하는것보다 vitual은 대부분 한다 생각하고 virtual 선언을 빼야하는 경우가 있다면 그경우를 생각하는 것이 좋을듯 싶다.

말이 길어졌다. 대부분 이해할수있다 생각하고 글을 쓰는것이고 앞으로 부족한 용어설명이나 개념들은 순서에 상관없이 언젠가는 올리겠다.

반응형