매개변수가 있는 생성자
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 19번째.
매개변수가 있는 생성자는 객체 생성 시 특정 값으로 객체를 초기화할 수 있도록 인수를 받습니다. 기본값에 의존하는 대신, 각 객체의 초기 상태를 원하는 대로 설정할 수 있습니다.
class Player {
std::string name;
int health;
int level;
public:
Player(std::string n, int h, int lvl) {
name = n;
health = h;
level = lvl;
}
};
Player hero("Archer", 100, 5);
Player mage("Wizard", 80, 7);서로 다른 매개변수 목록을 가진 여러 개의 매개변수화된 생성자를 정의할 수 있습니다. 이를 생성자 오버로딩(constructor overloading)이라고 하며, 컴파일러는 사용자가 제공하는 인수를 기반으로 적절한 생성자를 선택합니다.
class Rectangle {
int width, height;
public:
Rectangle(int side) { // 정사각형
width = height = side;
}
Rectangle(int w, int h) { // 직사각형
width = w;
height = h;
}
};
Rectangle square(10); // 첫 번째 생성자 호출
Rectangle rect(10, 20); // 두 번째 생성자 호출매개변수는 기본값을 가질 수 있어 일부 인수를 선택 사항으로 만들 수 있습니다. 이는 여러 개의 오버로드된 생성자의 필요성을 줄여줍니다.
class Enemy {
std::string type;
int damage;
public:
Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};
Enemy goblin("Goblin"); // damage의 기본값은 10입니다
Enemy dragon("Dragon", 50); // damage가 50으로 설정됩니다이전 레슨에서 배운 내용을 기억해 보세요. 매개변수가 있는 생성자(parameterized constructor)를 정의하면, 컴파일러는 더 이상 기본 생성자(default constructor)를 자동으로 생성하지 않습니다. 두 가지가 모두 필요한 경우, 기본 생성자를 명시적으로 정의해야 합니다.
챌린지
쉬움매개변수가 있는 생성자를 통해 특정 초기값으로 객체를 생성하는 방법과 생성자 오버로딩이 객체 생성에 어떻게 유연성을 제공하는지 보여주는 제품 인벤토리 시스템을 구축해 보겠습니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
Product.h: 인벤토리의 항목을 나타내는Product클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:name(string),price(double),quantity(integer)를 위한 private 속성- 제품을 완전히 초기화하기 위해 세 개의 매개변수(name, price, quantity)를 모두 받는 생성자
- 이름과 가격만 받고, 수량은 기본값인
1로 설정하는 생성자 - 이름만 받고, 가격은 기본값인
0.0, 수량은 기본값인0으로 설정하는 생성자 - 제품 정보를
"<name>: "<name>: $<price> (x<quantity>)"lt;price> (x<quantity>)"형식으로 출력하는display()메서드 - 가격에 수량을 곱한 값을 반환하는
getTotalValue()메서드
main.cpp: 입력을 읽고 다양한 방식으로 제품을 생성하여 세 가지 생성자를 모두 시연합니다. 입력에서 다음을 읽습니다:- 첫 번째 줄: 제품 이름, 가격, 수량 (공백으로 구분)
- 두 번째 줄: 제품 이름과 가격 (공백으로 구분)
- 세 번째 줄: 제품 이름만
display()를 호출한 다음, 세 제품의 총 가치를 합산하여"Total inventory value: "Total inventory value: $<value>"lt;value>"형식으로 출력합니다.
가격 출력의 경우, 소수점 한 자리까지 표시하십시오. 예를 들어, 가격이 999.99이고 수량이 5인 "Laptop" 제품을 생성하면, 디스플레이에는 "Laptop: $999.99 (x5)"가 표시되어야 합니다.
main.cpp에서 #include "Product.h"를 사용하여 헤더 파일을 포함하십시오.
치트 시트
매개변수가 있는 생성자(parameterized constructor)는 객체 생성 시 특정 값으로 객체를 초기화하기 위해 인수를 받습니다:
class Player {
std::string name;
int health;
int level;
public:
Player(std::string n, int h, int lvl) {
name = n;
health = h;
level = lvl;
}
};
Player hero("Archer", 100, 5);생성자 오버로딩(Constructor overloading)을 사용하면 매개변수 목록이 다른 여러 생성자를 정의할 수 있습니다:
class Rectangle {
int width, height;
public:
Rectangle(int side) { // 정사각형
width = height = side;
}
Rectangle(int w, int h) { // 직사각형
width = w;
height = h;
}
};
Rectangle square(10); // 첫 번째 생성자 호출
Rectangle rect(10, 20); // 두 번째 생성자 호출기본 매개변수 값(Default parameter values)을 사용하면 인수를 선택 사항으로 만들 수 있습니다:
class Enemy {
std::string type;
int damage;
public:
Enemy(std::string t, int d = 10) : type(t), damage(d) {}
};
Enemy goblin("Goblin"); // damage의 기본값은 10입니다
Enemy dragon("Dragon", 50); // damage가 50으로 설정됩니다매개변수가 있는 생성자를 직접 정의하면, 컴파일러는 더 이상 기본 생성자를 자동으로 생성하지 않습니다.
직접 해보기
#include <iostream>
#include <iomanip>
#include <string>
#include "Product.h"
using namespace std;
int main() {
// 첫 번째 제품 읽기: 이름, 가격, 수량
string name1;
double price1;
int quantity1;
cin >> name1 >> price1 >> quantity1;
// 두 번째 제품 읽기: 이름, 가격
string name2;
double price2;
cin >> name2 >> price2;
// 세 번째 제품 읽기: 이름만
string name3;
cin >> name3;
// TODO: 각 제품에 적절한 생성자를 사용하여 세 개의 Product 객체 생성
// TODO: 각 제품에 대해 display() 호출
// TODO: 전체 재고 가치 계산 및 출력
// 형식: "Total inventory value: $<value>"
// 소수점 한 자리를 위해 fixed와 setprecision(1) 사용
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.