기본 생성자
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 18번째.
기본 생성자(default constructor)는 인자 없이 호출할 수 있는 생성자입니다. 초기값이 제공되지 않을 때 객체를 초기화합니다. 모든 클래스는 유효한 기본 상태로 객체를 생성하는 방법이 필요합니다.
생성자를 정의하지 않으면, 컴파일러는 기본 타입(primitive types)에 대해서는 아무 작업도 수행하지 않고 멤버 객체에 대해서는 기본 생성자를 호출하는 암시적 기본 생성자를 생성합니다.
class Player {
int health;
int score;
public:
Player() { // 기본 생성자
health = 100;
score = 0;
}
};
Player p1; // 기본 생성자를 호출함
Player p2{}; // 마찬가지로 기본 생성자를 호출함일단 (매개변수가 있는 생성자와 같은) 생성자를 정의하면, 컴파일러는 더 이상 기본 생성자를 생성하지 않습니다. 만약 기본 생성자가 여전히 필요하다면 명시적으로 정의해야 합니다.
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // 매개변수가 있는 생성자만 존재
};
Enemy e1(10); // 정상 작동
Enemy e2; // 오류! 기본 생성자가 없음현대 C++에서는 = default를 사용하여 컴파일러가 생성한 기본 생성자를 명시적으로 요청할 수 있습니다:
class Item {
int id;
public:
Item() = default; // 컴파일러가 기본 생성자를 생성합니다
Item(int i) : id(i) {}
};기본 생성자는 객체 배열을 생성하거나, 인자 없이 요소를 생성해야 할 수도 있는 std::vector와 같은 컨테이너에서 사용되는 클래스들에 필수적입니다.
챌린지
쉬움기본 생성자가 객체를 유효한 시작 상태로 초기화하는 방법을 보여주는 간단한 카운터 시스템을 만들어 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
Counter.h: 카운트 값을 추적하는Counter클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:- 프라이빗
count속성 (정수형) - 카운터를 식별하기 위한 프라이빗
name속성 (문자열) count를0으로,name을"Unnamed"로 초기화한 후,"Counter created: <name>"를 출력하는 기본 생성자- 카운트를 1씩 증가시키는
increment()메서드 - 현재 카운트를 반환하는
getCount()메서드 - 카운터의 이름을 반환하는
getName()메서드
- 프라이빗
main.cpp: 다양한 방식으로 객체를 생성할 때 기본 생성자가 어떻게 작동하는지 보여줍니다. 입력으로부터 카운터를 몇 번 증가시킬지 나타내는 숫자를 읽은 후 다음을 수행합니다:- 직접 초기화를 사용하여 Counter 생성:
Counter c1; - 중괄호 초기화를 사용하여 또 다른 Counter 생성:
Counter c2{}; - 입력으로 지정된 횟수만큼
c1을 증가시킵니다. - c1에 대해
"<name>: <count>"를 출력합니다. - c2에 대해
"<name>: <count>"를 출력합니다.
- 직접 초기화를 사용하여 Counter 생성:
기본 생성자 덕분에 두 카운터 모두 0에서 시작해야 하지만, c1만 증가하게 됩니다. 이는 기본 생성자가 객체가 생성되는 방식에 관계없이 모든 객체가 예측 가능하고 유효한 상태에서 시작되도록 보장하는 방법을 보여줍니다.
#include "Counter.h"를 사용하여 main.cpp에 헤더 파일을 포함하세요.
치트 시트
기본 생성자(default constructor)는 인자 없이 호출할 수 있는 생성자입니다. 초기값이 제공되지 않았을 때 객체를 초기화하는 역할을 합니다.
class Player {
int health;
int score;
public:
Player() { // Default constructor
health = 100;
score = 0;
}
};
Player p1; // Calls default constructor
Player p2{}; // Also calls default constructor생성자를 하나도 정의하지 않으면, 컴파일러가 암시적인 기본 생성자를 생성합니다. 하지만 매개변수가 있는 생성자와 같이 어떤 생성자라도 직접 정의하면, 컴파일러는 더 이상 기본 생성자를 자동으로 생성하지 않습니다.
class Enemy {
int damage;
public:
Enemy(int d) : damage(d) {} // Parameterized constructor only
};
Enemy e1(10); // Works
Enemy e2; // Error! No default constructor= default를 사용하여 컴파일러가 생성하는 기본 생성자를 명시적으로 요청할 수 있습니다.
class Item {
int id;
public:
Item() = default; // Compiler generates default constructor
Item(int i) : id(i) {}
};기본 생성자는 객체 배열을 생성하거나 std::vector와 같은 컨테이너에서 사용되는 클래스에 필수적입니다.
직접 해보기
#include <iostream>
#include "Counter.h"
using namespace std;
int main() {
// 증가시킬 횟수를 읽어옵니다
int n;
cin >> n;
// TODO: 직접 초기화를 사용하여 Counter를 생성하세요: Counter c1;
// TODO: 중괄호 초기화를 사용하여 또 다른 Counter를 생성하세요: Counter c2{};
// TODO: n에 지정된 횟수만큼 c1을 증가시키세요
// TODO: c1에 대해 "<name>: <count>"를 출력하세요
// TODO: c2에 대해 "<name>: <count>"를 출력하세요
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.