C++/C++ : Study

OOP - (5) 생성자와 소멸자

더블유제이플로어 2024. 10. 21. 01:16

(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