본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Classic C++ : 클래스 멤버 배열 초기화

by snowoods 2025. 11. 16.

Classic C++

클래스 멤버 배열 초기화

 

개요

클래스 멤버로 배열을 사용할 때 발생하는 초기화 문제와 그 해결 방법에 대해 알아봅니다.

 

C++ 버전별 주요 키워드 도입 시기

  • C++98 이전: enum 핵(hack)을 사용한 컴파일 타임 상수 정의가 사용되었습니다.
  • C++98: static const 멤버 변수를 클래스 내에서 초기화하는 기능이 도입되었습니다.
  • C++11: constexpr 키워드가 도입되어 컴파일 타임 상수를 더 명확하게 표현할 수 있게 되었습니다.

 

내용 설명

  • 클래스 정의 부분에서 const int size = 20; 와 같이 멤버 변수를 직접 초기화할 수 없습니다. 인스턴스 변수는 객체가 생성될 때 초기화되어야 하기 때문입니다.
  • const 인스턴스 데이터는 생성자의 초기화 목록에서 초기화해야 합니다.
  • 하지만 const 멤버를 초기화 목록에서 초기화하더라도, 그 값을 배열의 크기로 사용하는 것은 컴파일 오류(Constant expression required)를 발생시킵니다. 배열의 크기는 컴파일 시간에 결정되어야 하지만, const 멤버는 런타임에 객체가 생성될 때 값이 결정되기 때문입니다.

 

해결 방법

  1. enum 핵(hack): enum { size = 20 }; 와 같이 열거형을 사용하여 컴파일 시간 상수를 정의합니다. 이는 새로운 데이터 타입을 정의하는 것이 아니라 값에 이름을 부여하는 방식입니다.
  2. static const 변수: static const int size = 20; 와 같이 정적 상수 멤버를 사용합니다. static 멤버는 클래스의 모든 객체가 공유하며, 컴파일 시간에 값이 결정되므로 배열 크기로 사용할 수 있습니다. (구식 컴파일러에서는 지원하지 않을 수 있습니다.)

 

예제 코드 (enum 핵 사용)

class Stack
{
private:
    enum { size = 20 };    // 컴파일 시간에 설정됨
    int st[size];
    int top;

public:
    Stack() : top(100) {}
};

 

예제 코드 (static const 사용)

class Stack
{
private:
    static const int size = 20;    // 정적 상수
    int st[size];
    int top;

public:
    Stack() : top(100) {}
};

 

활용팁

  • 배열 크기와 같이 컴파일 시간에 결정되어야 하는 상수는 enum 핵이나 static const (또는 C++11 이후라면 constexpr)를 사용하는 것이 좋습니다. 이는 단순한 숫자 리터럴을 사용하는 것보다 코드의 가독성과 유지보수성을 높여줍니다.