
클래스 멤버 배열 초기화
개요
클래스 멤버로 배열을 사용할 때 발생하는 초기화 문제와 그 해결 방법에 대해 알아봅니다.
C++ 버전별 주요 키워드 도입 시기
- C++98 이전:
enum핵(hack)을 사용한 컴파일 타임 상수 정의가 사용되었습니다. - C++98:
static const멤버 변수를 클래스 내에서 초기화하는 기능이 도입되었습니다. - C++11:
constexpr키워드가 도입되어 컴파일 타임 상수를 더 명확하게 표현할 수 있게 되었습니다.
내용 설명
- 클래스 정의 부분에서
const int size = 20;와 같이 멤버 변수를 직접 초기화할 수 없습니다. 인스턴스 변수는 객체가 생성될 때 초기화되어야 하기 때문입니다. const인스턴스 데이터는 생성자의 초기화 목록에서 초기화해야 합니다.- 하지만
const멤버를 초기화 목록에서 초기화하더라도, 그 값을 배열의 크기로 사용하는 것은 컴파일 오류(Constant expression required)를 발생시킵니다. 배열의 크기는 컴파일 시간에 결정되어야 하지만,const멤버는 런타임에 객체가 생성될 때 값이 결정되기 때문입니다.
해결 방법
enum핵(hack):enum { size = 20 };와 같이 열거형을 사용하여 컴파일 시간 상수를 정의합니다. 이는 새로운 데이터 타입을 정의하는 것이 아니라 값에 이름을 부여하는 방식입니다.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)를 사용하는 것이 좋습니다. 이는 단순한 숫자 리터럴을 사용하는 것보다 코드의 가독성과 유지보수성을 높여줍니다.
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
| Classic C++ : 1인수 생성자 (0) | 2025.11.15 |
|---|---|
| Classic C++ : 기본 생성자와 2인수 생성자 (0) | 2025.11.14 |
| Classic C++ : 생성자(constructor)와 소멸자(destructor) (0) | 2025.11.02 |
| Before Classic C++ : 레퍼런스(&)와 포인터(*) (0) | 2025.11.01 |
| Before Classic C++ : struct (1) | 2025.10.31 |
| Before Classic C++ : Preprocessor (0) | 2025.10.30 |
| Before Classic C++ : Bitwise Operators (0) | 2025.10.29 |
| Before Classic C++ : Conditional Operator (1) | 2025.10.28 |