19일차 (1/8)
소멸자
C++프로그래머들은 delete 만을 사용하는 함수를 특정 상황이 아니면 명시적으로 호출하지 않는다. 그 이유는 소멸자가 있기 때문이다.
소멸자는 ~클래스명 이런 형식으로 사용하는데 소멸자의 이름은 ~하나라고 볼 수 있다.
보통 소멸자에서 동적 할당을 정리한다.
~Player() override
{
DeleteSword();
}
void DeleteSword()
{
delete Sword;
}
소멸자는 생성자와 다르게 일반 멤버변수처럼 직접 호출할 수 있는데 아무도 직접 호출하지 않는다.
NewPlayer.~Player();
위는 직접 호출의 예시이다.
그리고 상속관계에서 자식의 소멸자가 먼저 호출된다.
소멸자는 인자를 넣어줄 수 없다.
만약 소멸자를 따로 만들어주지 않으면 기본 소멸자가 생성된다.
fightunit** allmonster = new fightunit*[140];
for (int i = 0; i < 100; i++)
{
allmonster[i] = new orc();
}
for (int i = 100; i < 120; i++)
{
allmonster[i] = new dragon();
}
for (int i = 120; i < 140; i++)
{
allmonster[i] = new kobolt();
}
위는 다형성을 통해 관리하는 방식이다.
다형성을 이용하려고 부모 형태로 자식 클래스를 관리할 경우 소멸자가 호출될 때 부모형의 소멸자만 호출되는 경우가 있는데 그걸 해결하기 위해 부모 소멸자를 virtual로 하고 자식 소멸자에 override를 붙여서 사용한다.
자료구조
어떠한 것들을 메모리적으로 배치하는 방법이 자료구조이다.
그리고 그렇게 배치한 구조에서 어떻게 자료를 새롭게 추가하거나 찾거나 삭제할 것인지에 대한 것들까지 자료구조라고 한다.
배열이라는 기본 문법은 불편한 점이 있다. 특히 정적 배열이 불편한 점들이 대입이 되지않거나 크기를 동적으로 바꿀 수도 없고 그 크기를 알수없는 등 많다.
클래스디폴트
접근 제한 지정자, 생성자, 복사 생성자, 소멸자, 대입연산자 등은 클래스가 생성되면 기본적으로 생성되어있다.
그중 복사 생성자는 클래스 자신을 넣는 형태이다.
얕은 복사, 깊은 복사
- 얕은 복사 : 참조만 복사하는 복사를 얕은 복사라고 한다.
- 깊은 복사 : 참조의 내부에 존재하는 값을 복사하거나 내부의 있는 값을 메모리를 동일하게 확장시켜서 복사하면 깊은 복사라고 한다.
깊은 복사는 지워버리고 다시 복사할 대상과 같은 값을 가지게 넣는다.
C++은 절차지향, 객체지향, 템플릿 3종류의 페러다임을 사용하는 언어이다.
그 중 템플릿(제네릭 프로그래밍, 템플릿 메타 프로그래밍)은 내일 이어서.
프로그래밍 시에 주의할 점
- 상속을 내리려는 클래스라면 무조건 생성자와 소멸자를 다 만든다. 그리고 상속받는 자식들도 웬만하면 생성자와 소멸자를 다 만든다.
- 한줄함수 금지