C++ 초급 - 7. 구조체와 클래스 (3 - 생성자와 소멸자 (Constructor & Destructor))

2025. 2. 22. 14:04프로그래밍 언어/C++

📌 7.3 생성자와 소멸자 (Constructor & Destructor)

클래스에는 객체가 생성될 때 자동으로 호출되는 생성자(Constructor)객체가 소멸될 때 호출되는 소멸자(Destructor)가 존재한다.
이들은 객체의 초기화 및 메모리 정리 역할을 수행하며, 객체 지향 프로그래밍(OOP)에서 필수적인 개념이다.


📌 1. 생성자 개념 및 역할

🔹 (1) 생성자란?

생성자(Constructor)객체가 생성될 때 자동으로 호출되는 함수이다.

  • 클래스와 동일한 이름을 가짐.
  • 반환값을 가지지 않음 (void조차 사용하지 않음).
  • 객체가 생성될 때 자동 실행됨.

💡 기본 문법

class 클래스이름 {
public:
    클래스이름();  // 생성자 선언
};

💡 예제: 기본 생성자

#include <iostream>

class Car {
public:
    Car() {  // 생성자 정의
        std::cout << "자동차 객체 생성!" << std::endl;
    }
};

int main() {
    Car car1;  // 생성자가 자동 호출됨
    return 0;
}

🔹 출력 결과

자동차 객체 생성!

💡 설명

  • Car() 생성자가 객체 car1 생성 시 자동으로 호출됨.

📌 2. 매개변수를 받는 생성자 (오버로딩)

🔹 (1) 생성자 오버로딩

  • 매개변수를 받는 생성자를 사용하면 객체를 다양한 방법으로 초기화 가능.
  • 기본 생성자 + 여러 개의 생성자를 정의하여 오버로딩 가능.

💡 예제: 생성자 오버로딩

#include <iostream>

class Car {
private:
    std::string brand;
    int year;

public:
    // 기본 생성자
    Car() {
        brand = "Unknown";
        year = 0;
        std::cout << "기본 생성자 호출!" << std::endl;
    }

    // 매개변수를 받는 생성자
    Car(std::string b, int y) {
        brand = b;
        year = y;
        std::cout << "매개변수 생성자 호출: " << brand << " (" << year << ")" << std::endl;
    }

    void printInfo() {
        std::cout << "브랜드: " << brand << ", 연식: " << year << std::endl;
    }
};

int main() {
    Car car1;  // 기본 생성자 호출
    Car car2("Toyota", 2022);  // 매개변수 생성자 호출

    car1.printInfo();
    car2.printInfo();

    return 0;
}

🔹 출력 결과

기본 생성자 호출!
매개변수 생성자 호출: Toyota (2022)
브랜드: Unknown, 연식: 0
브랜드: Toyota, 연식: 2022

💡 설명

  • Car() → 기본 생성자 호출.
  • Car("Toyota", 2022); → 매개변수를 받는 생성자 호출.
  • 생성자 오버로딩을 통해 다양한 초기화 방식 제공.

📌 3. 소멸자의 역할과 자동 호출

🔹 (1) 소멸자란?

  • 객체가 소멸될 때 자동 호출되는 함수.
  • 클래스 이름 앞에 ~(틸드)를 붙여 선언.
  • 반환값이 없으며, 매개변수를 받을 수 없음.
  • 메모리 해제 및 정리 작업을 수행.

💡 기본 문법

class 클래스이름 {
public:
    ~클래스이름();  // 소멸자 선언
};

💡 예제: 소멸자 자동 호출

#include <iostream>

class Car {
public:
    Car() { std::cout << "자동차 객체 생성!" << std::endl; }
    ~Car() { std::cout << "자동차 객체 소멸!" << std::endl; }
};

int main() {
    Car car1;  // 생성자가 자동 호출됨
    return 0;  // 함수 종료 시 소멸자가 자동 호출됨
}

🔹 출력 결과

자동차 객체 생성!
자동차 객체 소멸!

💡 설명

  • Car() → 객체 생성 시 생성자가 호출됨.
  • ~Car() → 객체 소멸 시 소멸자가 자동 호출됨.

📌 4. 동적 메모리 할당과 소멸자 활용 (new/delete)

🔹 (1) new 연산자로 객체 동적 할당

  • new 키워드를 사용하면 객체를 동적으로 생성 가능.
  • 동적으로 할당된 객체는 delete를 사용하여 수동으로 해제해야 함.

💡 예제: new 연산자로 동적 할당

#include <iostream>

class Car {
public:
    Car() { std::cout << "자동차 객체 생성!" << std::endl; }
    ~Car() { std::cout << "자동차 객체 소멸!" << std::endl; }
};

int main() {
    Car* carPtr = new Car();  // 동적 객체 생성

    delete carPtr;  // 수동으로 객체 해제 (소멸자 호출)
    return 0;
}

🔹 출력 결과

자동차 객체 생성!
자동차 객체 소멸!

💡 설명

  • new Car(); → 객체를 동적으로 생성.
  • delete carPtr; → 소멸자가 호출되며 객체가 메모리에서 해제됨.

📌 5. 정리

개념 설명
생성자(Constructor) 객체가 생성될 때 자동 호출
기본 생성자 클래스명() { ... }
매개변수 생성자 클래스명(타입 변수) { ... }
생성자 오버로딩 여러 개의 생성자 정의 가능
소멸자(Destructor) 객체가 소멸될 때 자동 호출 (~클래스명() { ... })
동적 객체 생성 new 키워드 사용 (new 클래스명();)
객체 해제 delete 사용 (delete 포인터;)