본문 바로가기

C++

[TIL 19장] 클래스 특성 - 캡슐화, 클래스 - 생성자, 소멸자

오늘의 TIL 목차 (22.08. 30)

 

  • 클래스 특성 - 캡슐화
  • 클래스 - 생성자
  • 클래스 - 소멸자

생성자


[ 생성자 ]

: 클래스에서 자동으로 선언 및 호출되는 객체 생성과 초기화를 목적으로 한 것

클래스명(매개변수)
{
몜버 변수 초기화;
};
class Dainn
{
private: // 클래스는 멤버 변수를 private으로 해주는 게 상책 (은닉화)
	int m_iA;
    
public: // 생성자는 이름이 클래스명, 매개변수에 따른 함수 오버로딩 가능
	Dainn() { m_iA = 0; }; // 기본 생성자, 생성자를 명시적 선언하지 않을 경우 자동 생성되는 생성자
    Dainn(int _iA) { m_iA = _iA; }; // 생성자는 '대입을 통한 초기화'
}

※ 객체 생성 과정 : 1. 메모리 할당     2. 생성자 호출 (둘 중  한 개라도 동작하지 않으면 객체 생성 불가)

■ 기능 / 주의

  • 생성자는 객체 생성 시 코드 내부적으로 자동생성(묵시적 생성)된다. (명시적으로 생성할 경우 자동 생성 X)
  • 묵시적 생성 시 기본 생성자가 생성되며 명시적 생성 시 기본 생성자가 생성되지 않는다. (직접 생성해야 함)
  • 생성자는 오버로딩이 가능하기 떄문에 매개변수에 따라 여러 개 존재할 수 있다.
  • 오버로딩을 이용하여 원하는 생성자를 통해 매개변수를 초기화할 수 있다.
    - 오버로딩 : 같은 이름의 함수가 매개변수의 타입, 갯수에 따라 구분되어 사용되는 것
  • 생성자는 목적이 객체 생성이기 때문에 반환값이 필요 없다. ( void 타입 )
  • 생성자는 함수처럼 호출해서 사용하는 것이 아니기 때문에 이름이 존재하지 않는다. ( 클래스명과 동일 )
  • 객체 생성 시 생성자는 자동 호출되기 때문에 생성자를 호출하지 않아도 생성자 안의 내용을 자동 실행한다.

 

■ 예시

class.h

#pragma once
#include "Define.h" // Define.h는 구조체, #define 헤더파일

class cPlayer
{
private:
	tInfo* m_tPlayer; // 동적할당을 위한 포인터 선언

public:
	cPlayer(void);
	~cPlayer(void);

public:
	void Initialize(void); // 초기화
	void Release(void); // 동적 할당 해제 함수
};

class.cpp

#include "stdafx.h"
#include "class.h"

cPlayer::cPlayer(void)
{
	cout << "생성자 자동 호출" << endl;
}

main.cpp

void main(void)
{
	// 객체 생성 시 1. 메모리 할당 2. 생성자 자동 호출 ( 무조건 둘 다 실행 시 객체 생성 )
    // 객체 생성 구간에서 자동으로 기본 생성자 호출
	cPlayer player; 
	
	return;
}

출력결과:
생성자 자동 호출

 

[ 소멸자 ]

: 클래스에서 함수가 종료될 때 자동으로 호출되는 것

~클래스명(void)
{
몜버 변수 초기화;
};

-

// class.cpp
#include "stdafx.h"
#include "class.h" // 선언부 헤더파일 포함

cPlayer::~cPlayer(void)
{
	cout << "소멸자 자동 호출" << endl;
}

// main.cpp
#include "stdafx.h"
#include "class.h"

void main(void)
{
	cPlayer player; // 클래스 cPlayer 자료형 타입의 player 객체 생성
	
	return; // 함수 종료 구간에서 소멸자 자동 호출
}

출력 결과 : 
소멸자 자동 호출

 

■ 기능 / 주의

  • 소멸자는 생성자와 달리 void 매개변수 단 하나만 존재
  • 소멸자를 명시적 선언할 경우 내부코드는 코드가 아닌 함수 ( ex. Release() )를 사용하는 것이 보편적.
  • 소멸자는 함수의 delete, return에서 호출됨 (void 타입 경우 함수 끝에 눈에 안 보인느 return 있음)
  • 소멸자 호출 순서는 후입선출 느낌으로 거꾸로 호출됨. (생성자와 호출 순서와 반대)

 

※ 동적 할당 calloc, malloc, free는 C 시절의 언어로 자동으로 생성자와 소멸자를 호출하지 않기 때문에 객체 생성 불가

- 힙 메모리에 4byte를 할당할 뿐 객체는 생성되지 않으니 사용 금지