(Summary) Constructor and Destructor
◆ 생성자
◆ 소멸자
◆ 기본 생성
중요한 Part이다.★★★★★
◆ 생성자
● 특수한 멤버 함수
● 객체가 생성될 때 자동으로 호출됨
● 초기화 목적으로 유용하게 사용됨
● 클래스와 목적으로 유용하게 사용됨
● 클래스와 동일한 이름을 갖는 멤버 함수
● 반환형은 존재하지 않음
● 오버로딩 가능
왜 특별하냐면 객체가 생성될 때 생성자가 자동으로 호출되기 때문이다.
객체의 초기화가 필요할 때 유용하게 쓸 수 있다.
생성자도 함수이긴 한대 클래스와 동일한 이름을 갖는 멤버함수이다.
반환형은 없으며 오버로딩이 가능하다.
코드로 보면 간단하다.
클래스와 관련해서 많은 코드를 보는 중에 반환형이 없고 클래스 이름과 동일한 것은 생성자라고 알아차릴 수 있어야 한다.
중요한 Part이다.★★★★★
◆ 소멸자
● 특수한 멤버 함수
● 객체가 소멸될 때 자동으로 호출됨
● 메모리 및 기타 리소스 (파일 close 등) 해제 목적으로 유용하게 사용됨
● 클래스와 동일한 이름 앞에 "~"을 갖는 멤버 함수
● 반환형 및 파라미터는 존재하지 않음
● 오버로딩 불가능!
소멸자는 객체가 소멸할 때 자동으로 소멸한다.
소멸한다는 뜻은 스택 메모리에서 데이터들이 있고,
함수 호출이 끝날경우 소멸된다.
Heap 메모리도 마찬가지이다.
객체를 new 연산자로 생성 후 delete 연산자로 소멸할 때 사용된다.
class Player
{
public :
Player();
Player(string name);
Player(string name, int health, int xp);
~Player();
private :
string name;
int health;
int xp;
};
◆ 소멸자
● 객체 또는 객체의 포인터가 소멸되는 시점에 자동으로 호출
{
Player slayer;
Player kim{ "Kim", 100, 4 };
Player hero{ "Hero" };
Player enemy{ "Enemy" };
// 4 destructor called
}
Player* enemy2 = new Player{ "Enemy2",1000,0 };
delete enemy2; // deestructor called
{ } 중괄호가 끝나면 지역 변수(객체)가 사라진다.
Heap 메모리에 동적할당 해놓은 객체가 지워질 때도 소멸자가 자동으로 호출된다.
소멸되는 시점이 언제인지 알아두어야 한다.
Default Constructor
◆ 기본 생성자
● 인자가 없는 생성자
● 클래스의 생성자를 직접 구현하지 않으면, 컴파일러가 기본적으로 생성자를 만들어 준다!
☞ 초반부에, 생성자가 없는 상태에서도 객체를 만들 수 있었다.
☞ 컴파일러가 기본 생성자를 알아서 만들어서 사용했기 때문이다.
● 객체를 인자 없이 생성하면 호출된다.
class Account2
{
public:
Account2()
{
cout << "계좌 생성됨" << endl;
}
~Account2()
{
cout << "소멸자 호출됨" << endl;
}
};
int main()
{
Account2 kim_Account;
return 0;
}
main 함수 -> Account2() -> main 함수 -> return -> ~Account2()
Declaring a Class
◆ 인자가 없는 클래스 생성자도 구현해 주는 것이 좋음
● 쓰레기 값은 항상 방지하는 것이 안전하다.
생성자에서는 초기화를 시켜주는 작업을 많이 한다.
코드를 넣고 main 함수에 디버깅을 누르고 F11을 누르면
자동으로 호출자가 생성이 되니깐 생성자로 넘어간다.
생성자가 초기화가 된 것을 확인할 수 있다.
또한 생성자는 인자를 받을 수 있다.
초기에 인자를 받아서 넘어온 인자값으로 생성자 초기화를 할 수 있다.
생성자에 초기화하는 구문. { } 와 ( )의 차이가 있지만 아직은 몰라도 된다.
생성자 초기화를 통해 초기화가 잘 되었음을 확인 가능하다.
생성자를 오버로딩 하였다.
Account() 와 Account(double, string)도 함수이며, 멤버함수이기 때문에
함수 오버로딩이 가능하다.
오버로딩은 함수 이름은 같은데 인자가 다르다.
◆ 인자가 있는 생성자만 구현한 경우
● 기본 생성자가 자동 생성되지 않는다.
Account에 기본 생성자가 없기 때문에 ERROR가 나온다.
컴파일러가 인자가 없는 생성자를 자동으로 만들어주지 않는다.
이유는 생성자를 개발자가 만들었기 때문이다.
동적 할당이 ERROR가 난 이유는 역시 동적 할당을 받는 생성자를 선언 안 했기 때문이다.
동적 할당이 선언하려면 아래처럼 작성하면 된다.
이 함수도 디버깅을 통해서 F11을 누르면 Account2(double, string); 함수에 들어가 있는 걸 확인할 수 있다.
역참조하여서 들어가있고, 스택 메모리에는 주소값만 적혀져 있는걸 확인 할 수 있다.
(Summary) Constructor and Destructor
◆ 생성자
● 객체가 생성될 때 자동 호출, 반환 없음.
◆ 소멸자
● 객체가 소멸 될 때 자동 호출, 오버로딩 불가능, 반환 없음.
◆ 기본 생성자
● 명시하지 않으면 자동으로 만들어주지만, 쓰레기 값은 없어야 하므로 구현이 필요하다.
● 인자가 있는 생성자를 만들면 기본 생성자는 자동 생성되지 않는다.
https://youtu.be/-hzrrt-5iec?si=VDm7kFILylAL3n7t
빨리 OOP를 마무리해야겠다.
'C++ > C++ : Study' 카테고리의 다른 글
OOP 파트2 - (1) 소개 (3) | 2024.10.28 |
---|---|
OOP - (6) 생성자 오버로딩 (0) | 2024.10.28 |
OOP - (4) 멤버 함수 (0) | 2024.10.14 |
OOP - (3) 멤버 접근 제한자 (0) | 2024.10.14 |
OOP - (2) 클래스와 객체 (0) | 2024.09.29 |