Menu
Coddy logo textTech

생성자 초기화 리스트

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 22번째.

이전 레슨에서 Player(std::string n, int h) : name(n), health(h) {}와 같은 콜론 구문을 본 적이 있습니다. 이를 멤버 이니셜라이저 목록이라고 하며, C++에서 멤버를 초기화하는 데 선호되는 방법입니다.

initializer 목록은 constructor의 매개변수 목록 뒤에 콜론으로 시작하여 나타납니다. 각 멤버는 해당 값으로 directly initialized되고, 쉼표로 구분됩니다:

class Rectangle {
    int width;
    int height;
    const int id;
    int& reference;
public:
    Rectangle(int w, int h, int i, int& r) 
        : width(w), height(h), id(i), reference(r) {
        // 생성자 본문 (비어 있을 수 있음)
    }
};

생성자 본문에서 대입 대신 초기화 리스트를 사용하는 이유는 무엇일까요? 대입을 사용하면 멤버가 먼저 기본 생성된 다음 새로운 값이 대입됩니다. 초기화 리스트를 사용하면 멤버가 올바른 값으로 직접 생성되므로 더 효율적이며, 경우에 따라서는 반드시 필요합니다.

특정 멤버는 다음 목록을 사용하여 초기화해야 합니다:

  • const 멤버 - construction 후에는 cannot 할당할 수 없음
  • 참조 멤버 - 초기화 시 바인딩되어야 함
  • 기본 생성자가 없는 멤버
class Player {
    const int maxHealth;    // 초기화 리스트를 사용해야 함
    std::string name;
public:
    // 이것은 작동함
    Player(int max, std::string n) : maxHealth(max), name(n) {}
    
    // 이것은 컴파일되지 않음:
    // Player(int max) { maxHealth = max; }  // 오류!
};

멤버는 초기화 목록의 순서가 아니라 class에서 declared된 순서로 initialized됩니다. 혼동을 피하려면 항상 선언 순서에 따라 초기화 목록을 작성하세요.

challenge icon

챌린지

쉬움

멤버 초기화 리스트가 언제, 왜 필수적인지 보여 주는 게임 엔진용 configuration system을 만들어 보겠습니다. 초기화 리스트 구문을 사용하여 GameConfig 클래스를 만들고, 초기화 리스트를 사용해 반드시 initialized되어야 하는 멤버를 포함합니다.

코드를 구성하기 위해 두 개의 파일을 만듭니다:

  • GameConfig.h: 게임 설정을 저장하는 GameConfig 클래스를 define합니다. 클래스에는 다음이 있어야 합니다:
    • const std::string gameName: 생성 후 change할 수 없는 게임 제목
    • const int maxPlayers: constructor에서 고정되는 최대 플레이어 수
    • int& difficultyRef: external difficulty 설정에 대한 reference
    • int screenWidthint screenHeight: display 설정을 위한 일반 멤버
    • 필요한 모든 매개변수를 받고 initializer list를 사용해 EVERY 멤버를 initialized하는 constructor. initializer list는 클래스에서 멤버가 declared된 순서를 따라야 합니다
    • 다음 형식으로 configuration을 출력하는 display() 메서드:
      Game: <gameName>
      Max Players: <maxPlayers>
      Difficulty: <difficultyRef value>
      Resolution: <screenWidth>x<screenHeight>
  • main.cpp: input에서 configuration 값을 읽고 GameConfig object를 만듭니다. 다음이 필요합니다:
    • input에서 게임 이름(string), 최대 플레이어 수(int), difficulty(int), width(int), height(int)를 읽습니다. 각각 별도의 줄에 입력됩니다
    • config가 reference할 difficulty용 local int 변수를 만듭니다
    • initializer list constructor를 사용해 GameConfig object를 만듭니다
    • 초기 configuration을 표시하기 위해 display()를 Call합니다
    • difficultly 변수를 directly 수정합니다(2를 곱합니다)
    • "After difficulty change:"를 출력합니다
    • reference가 updated value를 반영한다는 것을 보여 주기 위해 display()를 again Call합니다

이 challenge는 initializer list가 중요한 이유를 보여 줍니다. const 멤버와 reference 멤버는 constructor body에서 assigned될 수 cannot 있습니다. 이들은 list에서 initialized되어야 합니다. reference 멤버는 또한 original variable에 대한 변경 사항이 config object를 통해 어떻게 반영되는지 보여 줍니다.

#include "GameConfig.h"를 사용하여 main.cpp에 header file을 include하세요.

직접 해보기

#include <iostream>
#include <string>
#include "GameConfig.h"

using namespace std;

int main() {
    // 입력 값 읽기
    string gameName;
    getline(cin, gameName);
    
    int maxPlayers;
    cin >> maxPlayers;
    
    int difficulty;
    cin >> difficulty;
    
    int width;
    cin >> width;
    
    int height;
    cin >> height;
    
    // TODO: 초기화 리스트 생성자를 사용하여 GameConfig 객체 생성
    // 생성자는 다음을 받아야 합니다: gameName, maxPlayers, difficulty (참조로), width, height
    
    // TODO: display()를 호출하여 초기 구성 표시
    
    // TODO: difficulty 변수를 직접 수정 (2를 곱함)
    
    // TODO: Print "After difficulty change:"
    
    // TODO: display()를 다시 호출하여 업데이트된 구성 표시
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러