본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 20. 생성자와 소멸자

앞선 강의에서


getter setter 또는 프로퍼티를 통하여 public에 있는 hp를 컨트롤 했다.


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


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


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

우선 지워버렸다.


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



1. 생성자와 소멸자


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

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


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


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


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


그 이유는 다음과 같다.


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


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


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

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


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


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

 

아무것도 안하는

public Character()

{

}


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


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


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

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



그러나 여기서 중요한것은

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




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

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




2. 소멸자

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

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


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

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


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

C#은 가비지 컬랙터가 동작해서 소멸자에서 크게 할게 없긴한데...


소멸될때 리소스반환, close 등 명시적으로 끝낫다는것을 알려줄때 사용된다.




728x90