기본 패턴
cpp
enum class Color {
red,
green,
blue
};
Color current = Color::green;설명
- 전통적인
enum은 열거자 이름이 바깥 scope로 퍼지고 정수와 암시적으로 섞일 수 있어, 큰 코드베이스에서 충돌과 혼란을 만들 수 있습니다. enum class는 열거자 이름을 자기 scope 안에 가두고, 정수로의 암시적 변환도 막아 타입 안정성을 높입니다.- 그래서 상태 값, 모드, 파싱 결과처럼 "서로 다른 범주의 값"을 분명히 나누고 싶을 때 특히 적합합니다.
- 비교할 때도
Color::green처럼 소속이 명확하게 드러나므로, 코드를 처음 읽는 사람도 의도를 훨씬 빨리 이해할 수 있습니다. - 필요하면
static_cast<int>(color)처럼 명시적 변환으로 정수값을 꺼낼 수 있지만, 이런 변환은 정말 필요한 위치에만 두는 편이 좋습니다.
짧은 예제
cpp
#include <iostream>
enum class State {
idle,
running,
stopped
};
int main() {
State state = State::running;
if (state == State::running) {
std::cout << "running\n";
}
}빠른 정리
| 항목 | 설명 |
|---|---|
enum | 전통적인 열거형, 정수와 더 쉽게 섞임 |
enum class | scope가 분리되고 타입 안정성이 더 높음 |
Color::red | 열거자에 접근할 때 소속 enum을 함께 씀 |
| 명시적 캐스팅 | 정수값이 필요하면 static_cast로 변환 |
| 추천 용도 | 상태, 모드, 옵션처럼 범주가 중요한 값 |
주의할 점
enum class는 안전하지만, 출력할 때 문자열이 자동으로 나오지는 않습니다. 사람이 읽는 로그가 필요하면 별도의 변환 함수나 switch를 함께 두는 편이 좋습니다.