Search

C++ 멤버 초기화 리스트

서론

C++에서 클래스의 멤버 변수를 초기화하는 가장 기본적인 방법은 생성자 본문 내에서 값을 할당하는 것입니다. 하지만 이 방식은 몇 가지 한계를 가지고 있습니다.
예를 들어, 상수 멤버 변수나 참조 멤버 변수는 생성자 본문에서 초기화할 수 없습니다. 이러한 문제를 해결하기 위해 C++에서는 멤버 초기화 리스트(member initializer list)라는 기능을 제공합니다.

멤버 초기화 리스트란?

멤버 초기화 리스트는 생성자 정의 후 콜론(’:’) 과 함께 사용되며, 클래스 멤버 변수를 초기화 하는 데 사용됩니다. 이 구문을 사용하면 생성자 본문이 실행되기 전에 멤버 변수를 초기화할 수 있으며, 특히 상수 멤버, 참조 멤버 및 부모 클래스의 생성자를 호출해야 하는 경우에 유용합니다.

멤버 초기화 리스트의 장점

효율성
멤버 변수를 본문 내에서 초기화하는 것보다 이니셜라이저 리스트를 사용하는 것이 더 효율적입니다. 이는 멤버 변수에 대한 불필요한 기본 생성 및 대입 연산을 피할 수 있기 때문입니다.
상수 및 참조 멤버 초기화
상수 및 참조 멤버는 반드시 초기화 리스트를 통해 초기화해야 합니다.
부모 클래스 초기화
상속받은 클래스의 생성자를 호출하여 멤버 변수를 초기화할 때 사용됩니다.

실제 사용 예시

상수 멤버 초기화

상수 멤버는 선언과 동시에 초기화되어야 하며, 이후에는 값을 변경할 수 없습니다. 멤버 초기화 리스트를 사용하면 생성자에서 상수 멤버를 초기화할 수 있습니다.
class ConstExample { public: ConstExample(int x) : constMember(x) { // 생성자 본문 } private: const int constMember; };
C++
복사

참조 멤버 초기화

참조 멤버 역시 생성 시 초기화되어야 하며, 멤버 초기화 리스트를 통해 초기화됩니다.
class ReferenceExample { public: ReferenceExample(int& ref) : refMember(ref) { // 생성자 본문 } private: int& refMember; };
C++
복사

부모 클래스 초기화

상속받은 클래스의 멤버 변수를 초기화하려면 부모 클래스의 생성자를 호출해야 합니다. 이는 멤버 초기화 리스트를 통해 수행됩니다.
class Base { public: Base(int n) : number(n) {} protected: int number; }; class Sub : public Base { public: Sub(int n, double d) : Base(n), doubleNumber(d) { // 생성자 본문 } private: double doubleNumber; };
C++
복사
여기서 Sub 클래스의 생성자는 부모 클래스 Base의 생성자를 호출하여 ‘number’ 멤버를 초기화하고, 동시에 자신의 ‘doubleNumber’ 멤버를 초기화합니다.
이러한 예시들은 멤버 초기화 변수가 앞서 언급한 장점들을 어떻게 구현하는지 보여줍니다. 이 기법을 통해 코드의 효율성과 명확성을 높일 수 있습니다.

주의사항 및 모범 사례

멤버 변수는 클래스 정의에서 선언된 순서대로 초기화됩니다. 초기화 리스트에서의 순서는 실제 초기화 순서에 영향을 주지 않습니다.
멤버에 디폴트 멤버 초기화가 있고, 동시에 생성자의 멤버 초기화 리스트에 나열되어 있는 경우, 멤버 초기화 리스트 값이 우선 적용됩니다.
복잡한 초기화 로직은 멤버 이니셜라이저 리스트보다 생성자 본문에서 처리하는 것이 좋을 수 있습니다. 이는 가독성과 코드 유지보수성을 향상시킬 수 있습니다.

결론

C++에서 멤버 초기화 리스트를 사용하는 것은 멤버 변수 초기화의 효율성과 명확성을 개선하는 훌륭한 방법입니다. 특히 상수 멤버, 참조 멤버 및 상속받은 클래스의 멤버 초기화에 필수적입니다. 이 기능을 활용함으로써 더 깔끔하고 효율적인 C++ 코드를 작성할 수 있습니다.

참고 자료