서론
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++ 코드를 작성할 수 있습니다.