midas+son의 크리에이티브(creative) 이야기

C++의 class에서 다른 class를 사용하는 변수를 지정할 때

보통 포인터 변수로 지정하는데 

포인터 변수로 선언했을 떄와 그냥 class 명으로만 선언했을 때 차이가 있다.


class명 만으로 변수를 만들게 되면 

해당 변수에 그 객체의 전체

모든게 들어 있다고 생각하면 된다.

그래서 만들자마자 생성자가 실행이 되어버린다.


class명 뒤에 *을 붙여서 변수를 만들면

해당 class에 대한 주소만을 변수에 담을 수 있다고 생각하자.

일단 더미 값이 들어가 있을 텐데

이 변수에 'new class명' 하게 되면

이것이 바로 동적 할당이다.

damagochi라는 class가 있고

헤더에 damagochi.h를 include하여

'damagochi* dam;' 라고 변수 선언 해주고

생성자에서 'dam = new damagochi;' 라 해주면

이때 damagochi 클래스의 생성자가 실행이 된다.

포인터 변수로의 접근은 'dam->함수나 변수'로 가능해진다.

(일반 변수라면 'dam.함수나 변수')


생성자, 소멸자 실행 차이를 확인해보자.

main이 되는 class에서 참조할 class의 이름 헤더와

이름의 변수를 그냥 참조 했을 시 어떻게 되는지 같이 확인하겠다.


mainGame이라는 class에서 damagochi라는 class를 가져다 쓰고자 한다.


차이를 파악하기 위해

mainGame과 damagochi의 생성자, 소멸자에 cout으로 표시를 해두었다.


포인터 변수 없이 class 사용법은 아래와 같다.



damagochi 클래스를 받아오는데 포인터 없이 선언하였다.

위와 같이 선언된 것들은 보통 사용할 때에는 dam. 처럼 

변수명 뒤에 점을 붙이면 damagochi class에 public 으로 

선언해둔 함수 리스트 들이 보인다.


하지만 실행했을 때 차이를 확인해볼 수 있다.



main이 되는 class는 mainGame인데

damagochi class가 먼저 생성되고 소멸자도 mainGame보다 늦게 된다.

이는 나중에 문제가 될 여지가 있을 수 있다고 생각되어진다.

(가능성의 얘기지 실제 문제가 된 것을 본것은 아니다. 

공부 중이므로 잘못된것은 알려주길 바란다.)


그럼 포인터로 하면 어떻게 될까?

아래처럼 class명 뒤에 *를 붙여 보았다.



결과는 

damagochi class에 대한 생성자와 소멸자가 나타나지 않는다.


new 로 동적 할당 하지 않는 이상 damagochi의 생성자가 나오지 않고

delete dam;을 하지 않으면 소멸자가 나타나지 않는다.


동적할당 하지 않아도

dam 변수명에 -> 로 접근하면 

damagochi class의 함수들이 나타나기는하지만

보통 초기화가 되지 않은 변수를 참조하게 되므로

안전하게 동적할당을 해주고 

생성자에서 변수들을 초기화 하거나

별도의 init()함수를 만들어서 init()을 먼저 호출한 뒤

사용해주기로 하자.


-------------------------------------

이 글은 정리 겸 차이를 적어 기억하고자 하는 글입니다.

틀린부분이 있으면 알려주시기 바랍니다. 

근거와 출처가 존재하는 가르침은 환영합니다. 감사합니다.