All is well

[YYBASIC0103/얌얌코딩] 생성자, 소멸자 본문

C++/YYBASIC

[YYBASIC0103/얌얌코딩] 생성자, 소멸자

D0YUN 2025. 2. 2. 13:43

생성자 : 객체 생성 시 (= 객체가 메모리에 할당될 때) 호출되는 함수

  • 생성자는 클래스와 이름이 같고 반환형이 없는 함수로, 직접 만들지 않아도 암시적으로 자동 생성되는 함수입니다.
  • 생성자는 객체 생성 후 해당 객체의 멤버 변수 초기화 용도로 사용이 가능한데 이 경우, 명시적으로 class 안에 생성자를 만들작업할 내용을 작성해야 합니다.
  • 일반적으로 생성자를 이용한 멤버 변수 초기화는
    1. class 객체를 생성한 후
    2. 생성자에서 멤버 변수 초기화가 진행됩니다.
    • `int a; a = 10; `와 같다고 이해하면 됩니다.
  • member initialize(멤버 이니셜라이즈) `: `를 사용하면 클래스 객체의 생성과 동시에 초기화가 가능합니다.
    • `int a = 10; `와 같다고 이해하면 됩니다.
    • cf) member initialize(멤버 이니셜라이즈) : 생성자에서 멤버 변수를 초기화할 때 사용하는 `: `구문
  • 생성자는 함수이므로 overloading이 가능합니다. 즉, 매개변수를 이용하여 객체 생성 시에 원하는 값으로 초기화가 가능합니다.

소멸자 : 객체 소멸 시 (= 객체가 메모리에서 해제될 때) 호출되는 함수

  • 소멸자는 클래스명 앞에 `~` 기호가 붙고 반환형이 없는 함수로, 생성자와 마찬가지로 암시적으로 자동 생성되는 함수입니다.
  • 메모리 해제 시 특정 작업을 해야 하면 명시적으로 class 안에 소멸자를 만들고 작업할 내용을 작성해야 합니다.
  • 소멸자는 가장 최신/마지막에 생성된 객체부터 호출하는데 그 이유는 다음과 같습니다.
    • 지역 변수Stack에 할당되어 **LIFO( Last In First Out )**방식으로 메모리에서 해제됩니다.
      • LIFO ( Last In First Out ) : 마지막에 들어온 객체가 먼저 나간다 - 프링글스
    • 객체지역 변수로 생성이 되므로 가장 최신/마지막에 생성된 객체부터 호출하게 됩니다.
    • ex) main()에서 People class 객체가 p1→p2→p3 순서대로 생성되었으면 p3→p2→p1 순서로 메모리에서 해제가 됨. 즉, p3→p2→p1 순서로 소멸자가 호출됨
  • 소멸자도 생성자와 마찬가지로 overloading이 가능합니다.
#include <iostream>
using namespace std;

class Test1
{
private:
    // 멤버 변수 생성
    int a, b;

public:
    // 일반적인 생성자 : 이미 생성된 객체의 멤버 변수 초기화 
    // 변수의 선언과 정의가 분리되어 있는 경우라고 생각하면 됨
    // int a;
    // a = 10;
    Test1()     
    {
        a = 0;
        b = 0;
    }

    // 함수 오버로딩
    Test1(int nA, int nB)
    {
        a = nA;
        b = nB;
    }

    // 소멸자
    ~Test1()
    {
        a = 0;
        b = 0;
    }
};


class Test2
{
private:
    int a, b;

public:
    // 멤버 이니셜라이즈(:)를 이용한 생성자 : 객체 생성과 동시에 멤버 변수 초기화
    // 변수의 선언과 정의가 한 번에 일어나는 경우라고 생각하면 됨
    // int a = 10;
    Test2() : a(0), b(0)
    {
        
    }

    // 함수 오버로딩
    Test2(int nA, int nB) : a(nA), b(nB)
    {

    }

    // 소멸자
    ~Test2()
    {
        a = 0;
        b = 0;
    }
};

int main()
{
    Test1 t1;
    Test2 t2;
}

LV01 클래스 생성자, 소멸자