본문 바로가기

교육 노트/C++ 심화강의

[C++ 때려잡기] C++ 심화강의 3 생성자와 소멸자

2018/08/27 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 1 객체 지향 프로그래밍과 클래스

2018/08/27 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 2 접근 한정자


앞선 강의에서


getter setter을 통하여 public에 있는 hp를 컨트롤 했다.


그런데 hp는 아무리 생각해도 만들어 질때를 제외하고 다시 setter를 사용해서 set할 필요는 없을것 같다.


어차피 아이템을 먹거나 몬스터에게 맞거나하면 obtainItem이나 hit 과같은 함수를 호출하면 알아서 조절될것 이기 때문이다.


처음에 고거 하나 하자고 set을 사용할 필요는 없다고 생각해

우선 지워버렸다.


그럼 이제 hp를처음에 어떻게 초기화 시켜줘야 하는가?



1. 생성자와 소멸자


class는 기본적으로 생성자와 소멸자를 가지고 있다.

생성자와 소멸자는 다음과 같다.


생성자 : 객체가 생성될때 실행되는 함수
소멸자 : 객체가 소멸할때 실행되는 함수


즉 생성자라는 것을 가지고 있어 생성될때 hp를 초기화 하면 되는것이다.


그런데 지금까지 아무리 봐도 생성자라는것은 본적도 없다.


그 이유는 다음과 같다.


생성자의 이름은 클래스의 이름과 동일하다.
사용자가 아무런 생성자를 만들어 주지않으면
아무기능을 하지않는 디폴트 생성자가 자동으로 생성된다.


우리가 아무런 생성자를 만들지 않아 아무것도 안하는 생성자가 자동으로 생성된것이다.


우선 생성자는 클래스 이름과 동일하다.

위의 클래스는 Mario라는 클래스이므로


Mario::Mario()라는 함수가 생성자일것이다.


우리는 이런걸 만들어 준적이 없으므로

 

아무것도 안하는

Mario::Mario()

{

}


를 자동으로 만들어주어 mario1이 생성될때 불리게 된다.


그러면 이제 우리가 직접 생성자를 만들어서 hp를 초기화 해보자


나는 기본적으로 hp를 100으로 설정해주게 하기위해서는

 hp 를 100으로 설정하는 Mario()생성자를 만들면된다.


만약에 hp를 직접 정하고 싶으면 hp를 받는 생성자를 만들면된다.


위에는 두 생성자를 모두 만든 경우이다


이와같이 구성을 하면


다음과 같이 사용할수있다.

생성자가 함수 오버로딩 되어 알아서 맞추어 들어가게 되는것이다.



그러나 여기서 중요한것은

생성자를 하나라도 직접 만들어주면 아무것도 안하는 디폴트 생성자가 만들어지지 않는다



즉 내가 hp를 받는 생성자만 만들게 되면

hp를 받지 못하는 생성자는 사용 할 수 없는것이다.







2. 소멸자

지금까지는 생성될때 불리는 함수를 알아봤는데

소멸할때 불리는 함수도 있다.


소멸자는 인자를 가질수 없고 클래스 명 앞에 ~(틸드)기호를 붙인것이다.

역시 만들어주지 않으면 아무것도 안하는 소멸자가 만들어진다.


아니 객체가 소멸할꺼면 그냥 없어지면 그만이지 왜 굳이 소멸자가 불리는것일까?



다음과 같이 클래스 내부에서 동적할당을 한경우

동적할당한것은 직접 delete를 해주어야 한다.

이런경우 소멸자에서 delete를 담당하게 된다.






728x90