75. C++ 열거형 (enum
, enum class
)
1. 개요
1.1 문서 개요
이 문서는 C++에서 제공하는 열거형(enum) 타입의 두 가지 형태인 전통적인 enum
과 C++11 이후 도입된 enum class
에 대해 정리합니다. 열거형은 관련 상수들을 그룹화하여 이름 있는 타입으로 정의할 수 있는 기능으로, 코드의 가독성과 안정성을 높이는 데 사용됩니다.
2. 내용
2.1 전통적인 enum
2.1.1 선언 방식
기존의 enum
은 다음과 같은 형식으로 선언합니다.
enum Color {
RED,
GREEN,
BLUE
};
2.1.2 사용 예
Color c = RED;
2.1.3 내부 동작
기본적으로 enum
은 정수형(int
)으로 취급되며, 열거자 값은 0부터 시작하여 자동 증가합니다.
enum Direction {
NORTH = 1,
EAST, // 2
SOUTH, // 3
WEST // 4
};
2.2 enum의 단점
- 이름 충돌 위험: 동일한 스코프 내에서 중복 이름 가능
- 암묵적인 정수형 변환 가능성: 타입 안정성이 낮음
enum Status { OK, FAIL };
int a = OK; // 암묵적 형 변환 허용
2.3 enum class (Scoped Enumeration)
2.3.1 개념 및 선언
C++11부터 도입된 enum class
는 스코프를 갖는 열거형으로, 열거자들이 외부에 노출되지 않습니다.
enum class Color {
RED,
GREEN,
BLUE
};
2.3.2 사용 방식
Color c = Color::RED;
2.3.3 장점
- 열거자 이름 충돌 방지
- 암묵적 정수형 변환 금지
- 명확한 타입 구분
int n = static_cast<int>(Color::GREEN); // 명시적 변환 필요
2.4 열거형의 기본형 지정
C++11 이후 enum
과 enum class
모두 기본 저장 타입을 지정할 수 있습니다.
enum class ErrorCode : uint8_t {
OK = 0,
WARNING = 1,
ERROR = 255
};
이 기능을 통해 메모리 최적화 및 외부 시스템과의 호환성을 높일 수 있습니다.
2.5 열거형을 활용한 switch 문
enum class Mode { AUTO, MANUAL };
Mode m = Mode::AUTO;
switch (m) {
case Mode::AUTO:
// 자동 모드 처리
break;
case Mode::MANUAL:
// 수동 모드 처리
break;
}
3. 마무리
C++에서 열거형은 상수 집합을 명확한 타입으로 표현할 수 있는 수단이며, enum class
는 전통적인 enum
의 한계를 극복하고 타입 안전성과 범위 제한을 제공하는 진화된 형태입니다. 스코프 충돌 방지, 정수형 변환 제한 등의 특성을 통해 현대 C++ 스타일에 더욱 적합한 열거형 표현이 가능합니다.