enum vs enum class
개요
C++98의 전통적 enum
과 C++11에서 도입된 enum class(Scoped enum)
를 비교하여, 각 방식의 특징, 장단점 및 사용 시 유의점을 정리한다.
C++ 버전별 주요 키워드 도입 시기
- C++98:
enum
- C++11:
enum class Name : UnderlyingType
(기반 타입 지정)
내용 설명
- 전통적
enum
(C++98)- 암시적 정수 변환 허용 → 타입 안전성 부족
- 열거자 이름이 전역 범위 오염 → 충돌 위험
- 기반 타입 지정 불가 (기본
int
)
enum class
(C++11)- 암시적 변환 금지 → 강한 타입 체킹
- 열거자 Scoped →
Color::RED
형태로 사용 - 기반 타입 지정 가능 (
enum class Color : uint8_t
) static_cast
를 이용한 명시적 변환 필요
예제 코드
// 01_enum_class_vs_enum_example.cpp
#include <iostream>
enum Color { RED, GREEN, BLUE };
enum class Fruit : unsigned char { APPLE = 0, BANANA, ORANGE };
int main() {
// 전통적 enum
Color c = BLUE;
int cVal = c; // 암시적 변환 허용
std::cout << "Traditional enum value: " << cVal << "\n";
// enum class
Fruit f = Fruit::BANANA;
// int fVal = f; // 컴파일 오류 (암시적 변환 금지)
int fVal = static_cast<int>(f);
std::cout << "Scoped enum value: " << fVal << "\n";
return 0;
}
실행 결과
아래 예제 코드를 컴파일 및 실행하면, 두 방식의 차이를 확인할 수 있다.
g++ -std=c++11 01_enum_class_vs_enum_example.cpp -o enum_test && ./enum_test
Traditional enum value: 2
Scoped enum value: 1
활용팁
- 타입 안전성이 중요한 API 설계 시
enum class
사용 권장. - 스코프 오염을 피하고자 할 때, 전역 namespace에 많은 열거자를 정의해야 한다면
enum class
를 선택. - 메모리 최적화가 필요하다면, 기반 타입을 명시하여 크기를 줄일 수 있음.
- 기존 코드와의 호환을 위해, 라이브러리 경계에서는 전통적
enum
을 유지하고 내부 로직에는enum class
를 도입하는 전략 활용.
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
Modern C++ 둘러보기 (1) | 2025.08.01 |
---|