[C++] #3.1 멤버 초기화 리스트 _ Member Initializer List

    반응형

    [C++] #3 생성자 (Construcotr) 포스팅에서 생성자 문법을 이용해 멤버에 값을 할당하는 방법에 대해 정리했다.

    하지만, 이는 값을 "할당" 하는 것이지 "초기화"하는 것은 아니다. 

    // 할당
    int a;
    a = 10;
    // 초기화
    int a = 10;

    이번 포스팅 에서는 생성자에 멤버 초기화 리스트 (Member Initializer List) 문법을 이용해 클래스의 멤버에 값을 "초기화" 하는 방법에 대해 간략하게 정리해 보고자 한다.

     

    * 개인적인 공부 내용을 기록하는 용도로 작성한 글 이기에 잘못된 내용을 포함하고 있을 수 있습니다.


    # 멤버 초기화 리스트 _ Member Initialier List

    멤버 초기화 리스트의 사용 방법은 다음과 같다.

    1. 생성자의 괄호 오른쪽에 콜론(:)을 붙여서 표기한다.

    2. 초기화할 멤버를 쉼표로 구분하여 표기하며, 소괄호() 를 이용해서 초기화한다.

     

    다음 예제는 Player() 생성자에 멤버 초기화 리스트를 이용해 멤버를 초기화 한 예제이다.

    class Player {
    private:
    	string m_name;
    	int m_level;
    	int m_hp;
    	int m_mp;
    	int m_atk;
    public:
    	// Constructor_ 멤버 초기화 리스트 사용 X
    	// Player() {
    	// 	m_name = "Player";
    	// 	m_level = 10;
    	// 	m_hp = 100;
    	// 	m_mp = 10;
    	// 	m_atk = 10;
    	// }
    	
    	// Member Initializer List
    	Player() : m_name("Player"), m_level(10), m_hp(100), m_mp(10), m_atk(10)
    	{
    		
    	}
    };

     

    멤버 초기화 리스트를 사용하면 무엇보다 코드가 보기에 간결하고 깔끔해진다!

    물론 사용해야 하는 이유가 단순히 보기 좋게 하기 위함만은 아니다. const 나, 참조(&) 변수를 클래스의 멤버로 사용할 때는 반드시 멤버 초기화 리스트를 사용해서 초기화 해야한다.

    왜냐하면 const혹은 참조(&)변수는 생성과 동시에 값을 할당 받아야 하기 때문이다.

     

    Player 클래스에 const 상수 m_id 라는 멤버를 private 필드에 추가 시켰다. 이전처럼 생성자를 이용해 값을 "할당" 하니 에러가 발생한다.

    class Player {
    private:
    	string m_name;
    	const int m_id;
    	int m_level;
    	int m_hp;
    	int m_mp;
    	int m_atk;
    public:
    	Player() {
    		m_name = "Player";
            	// 에러 발생
    		m_id = 1111;
    		m_level = 10;
    		m_hp = 100;
    		m_mp = 10;
    		m_atk = 10;
    	}
    };

     

    멤버 초기화 리스트를 사용해 m_id 값을 "초기화" 하는 방식으로 수정하니 에러가 발생하지 않는다.

    class Player {
    private:
    	string m_name;
    	const int m_id;
    	int m_level;
    	int m_hp;
    	int m_mp;
    	int m_atk;
    public:
    	// Member Initializer List
    	Player() : m_name("Player"), m_id(1111), m_level(10), m_hp(100), m_mp(10), m_atk(10)
    	{
    		
    	}
    };
    반응형

    댓글

    Designed by JB FACTORY