위임 생성자
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 23번째.
공통된 초기화 로직을 공유하는 여러 생성자가 있을 때, 코드 중복을 피하기 위해 위임 생성자(delegating constructors)를 사용할 수 있습니다. 위임 생성자는 초기화 리스트에서 동일한 클래스의 다른 생성자를 호출합니다.
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(std::string n) : Player(n, 100, 1) {}
// 기본 생성자 역시 위임합니다
Player() : Player("Unknown") {}
};위임은 클래스 이름 뒤에 인자가 오는 초기화 리스트에서 발생합니다. Player()가 호출되면 Player(std::string)으로 위임되고, 이는 다시 세 개의 매개변수를 가진 생성자로 위임됩니다. 이 체인은 대상 생성자에서 원래 생성자 방향으로 실행됩니다.
한 가지 중요한 규칙이 있습니다: 위임 생성자는 초기화 리스트에 다른 멤버를 가질 수 없습니다. 위임은 유일한 항목이어야 합니다:
class Item {
int id;
int value;
public:
Item(int i, int v) : id(i), value(v) {}
// 오류! 위임과 멤버 초기화를 혼합할 수 없습니다
// Item(int i) : Item(i, 0), id(i) {}
// 올바름 - 위임만 사용
Item(int i) : Item(i, 0) {}
};위임 생성자는 초기화 로직을 한 곳으로 집중시켜 코드를 유지보수하기 쉽게 만들고 중복된 코드로 인한 오류 발생 가능성을 줄여줍니다.
챌린지
쉬움생성자 위임(delegating constructors)을 통해 생성자 호출을 체이닝하여 코드 중복을 제거하는 방법을 보여주는 연결 설정 시스템을 구축해 보겠습니다.
코드를 정리하기 위해 두 개의 파일을 생성합니다:
Connection.h: 다양한 구성 옵션을 가진 네트워크 연결을 나타내는Connection클래스를 정의합니다. 클래스에는 다음이 포함되어야 합니다:- 프라이빗 멤버:
host(string),port(int),timeout(초 단위 int),secure(bool) - 네 개의 매개변수를 모두 받아 초기화 리스트를 사용하여 모든 멤버를 초기화하는 기본 생성자(primary constructor). 이 생성자는
"Connection configured: <host>:<port>"를 출력해야 합니다. host와port만 매개변수로 받는 생성자. 이 생성자는timeout의 기본값을30으로,secure의 기본값을false로 설정하여 기본 생성자(primary constructor)에 위임합니다.host만 매개변수로 받는 생성자. 이 생성자는port의 기본값을80으로 설정하여 두 개의 매개변수를 받는 생성자에 위임합니다.host의 기본값을"localhost"로 설정하여 하나의 매개변수를 받는 생성자에 위임하는 기본 생성자(default constructor)."<host>:<port> (timeout: <timeout>s, secure: <yes/no>)"형식의 문자열을 반환하는getInfo()메서드.
- 프라이빗 멤버:
main.cpp: 서로 다른 생성자를 사용하여 연결을 생성함으로써 위임 체인을 시연합니다. 입력으로부터 호스트 이름과 포트 번호를 읽어온 후(각각 별도의 줄에 입력됨), 다음을 수행합니다:- 기본 생성자(default constructor)를 사용하여
Connection을 생성합니다. - 입력받은 호스트만 사용하여
Connection을 생성합니다. - 입력받은 호스트와 포트를 모두 사용하여
Connection을 생성합니다. - 입력받은 호스트, 입력받은 포트,
60의 타임아웃, 그리고secure를true로 설정하여Connection을 생성합니다. - 각 연결에 대해
getInfo()를 호출하여 한 줄에 하나씩 출력합니다.
- 기본 생성자(default constructor)를 사용하여
위임 체인은 다음과 같이 흐릅니다: 기본 생성자(default constructor)가 하나의 매개변수를 받는 생성자를 호출하고, 이는 다시 두 개의 매개변수를 받는 생성자를 호출하며, 최종적으로 네 개의 매개변수를 받는 기본 생성자(primary constructor)를 호출합니다. 즉, 객체가 생성될 때마다 "Connection configured" 메시지가 항상 기본 생성자(primary constructor)에서 한 번씩 출력됩니다.
getInfo()의 보안 상태(secure status)에 대해서는, secure가 true이면 "yes"를, 그렇지 않으면 "no"를 출력하세요.
main.cpp에서 #include "Connection.h"를 사용하여 헤더 파일을 포함시키세요.
치트 시트
위임 생성자(delegating 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(std::string n) : Player(n, 100, 1) {}
// 기본 생성자도 위임합니다
Player() : Player("Unknown") {}
};위임은 클래스 이름 뒤에 인수를 사용하는 초기화 리스트에서 발생합니다. 생성자들은 하나가 다른 하나에게 위임하는 위임 체인을 형성할 수 있습니다.
중요한 규칙: 위임 생성자는 초기화 리스트에 다른 멤버를 가질 수 없습니다. 위임이 유일한 항목이어야 합니다:
class Item {
int id;
int value;
public:
Item(int i, int v) : id(i), value(v) {}
// 오류! 위임과 멤버 초기화를 혼합할 수 없습니다
// Item(int i) : Item(i, 0), id(i) {}
// 올바름 - 위임만 수행
Item(int i) : Item(i, 0) {}
};직접 해보기
#include <iostream>
#include <string>
#include "Connection.h"
using namespace std;
int main() {
// 입력 읽기
string host;
int port;
cin >> host;
cin >> port;
// TODO: 기본 생성자를 사용하여 Connection 생성
// TODO: 입력받은 host만을 사용하여 Connection 생성
// TODO: 입력받은 host와 port를 모두 사용하여 Connection 생성
// TODO: 입력받은 host, port와 timeout=60, secure=true를 사용하여 Connection 생성
// TODO: 각 연결에 대해 getInfo()를 한 줄에 하나씩 출력
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.