C++에서 enum class는 C++11에서 도입된 기능으로, 기존 enum의 단점을 보완하여 이름 충돌 방지와 타입 안전성을 제공합니다.
✅ enum과 enum class의 차이점
✅ 각 방식의 장단점과 사용 예제
✅ 비트 연산, 암묵적 변환, 네임스페이스 활용
이 문서에서는 enum class의 필요성과 사용법을 예제 코드와 함께 상세히 분석하겠습니다.
enum 방식 (Unscoped Enum)// 기존 enum
// unscoped enum - 범위 지정이 없어서 전역으로 값이 노출됨.
enum PlayerType : char // 크기 지정 가능
{
PT_None, // 기본적으로 0
PT_Knight = 5, // 명시적으로 5
PT_Archer, // 이전 값 +1 (6)
PT_Mage // 이전 값 +1 (7)
};
✅ 기존 enum의 특징
PlayerType은 범위가 지정되지 않아 전역 네임스페이스로 확장됨. enum PlayerType : char를 사용하면 크기를 char(1바이트)로 설정 가능. PT_None, PT_Knight 등의 값이 전역으로 퍼지므로 이름 충돌 가능성이 있음.enum MonsterType
{
None // PT_None과 충돌 가능
};
✅ 이름 충돌 문제 발생 가능
MonsterType::None과 PlayerType::PT_None은 다른 enum이지만, 전역에서 동일한 None 값으로 충돌할 위험이 있음. enum class를 사용!enum class 방식 (Scoped Enum)enum class ObjectType
{
Player,
Monster,
Projectile
};
✅ enum class의 주요 특징
ObjectType 안에서만 Player, Monster, Projectile을 사용할 수 있음. ObjectType::Player처럼 접근해야 함). enum class ObjectType2
{
Player,
Monster,
Projectile
};
✅ 이름 재사용 가능
ObjectType과 ObjectType2에 동일한 이름을 사용할 수 있음. enum에서는 불가능했던 이름 충돌 문제를 해결.main() 함수 분석int main()
{
✅ 프로그램의 실행 진입점.
enum은 암묵적 변환이 가능 double value = PT_Knight; // 가능
enum은 정수형 값과 암묵적으로 변환 가능하여, PT_Knight 값을 double에 할당할 수 있음.enum class는 암묵적 변환 불가능 double value2 = static_cast<double>(ObjectType::Player); // 명시적으로 변환 필요
enum class는 암묵적 변환이 불가능하여, static_cast를 사용해야 함. int choice;
cin >> choice;
if (choice == static_cast<int>(ObjectType2::Monster))
{
cout << "선택한 타입은 Monster입니다." << endl;
}
✅ 기존 enum에서는 if (choice == PT_Knight)처럼 바로 비교 가능했지만,
✅ enum class는 static_cast<int>를 사용해야 함
✅ 불편하지만, 명확한 타입 체크가 가능
enum class의 불편함 unsigned int bitFlag;
bitFlag = (1 << PT_Knight); // 기존 enum - 바로 사용 가능
bitFlag = (1 << static_cast<int>(ObjectType::Player)); // enum class - 변환 필요
✅ 기존 enum은 비트 연산에서 편리하지만,
✅ enum class는 비트 연산 전에 static_cast<int>가 필요하여 불편함
✅ 이 문제를 해결하려면 std::underlying_type을 사용할 수 있음.
cout << "sizeof(PlayerType): " << sizeof(PlayerType) << endl;
cout << "sizeof(ObjectType): " << sizeof(ObjectType) << endl;
✅ enum PlayerType : char로 크기를 명시했으므로 sizeof(PlayerType) == 1
✅ enum class의 크기는 기본적으로 int (4바이트)
enum과 enum class 비교 요약| 특징 | enum (기존 방식) | enum class (C++11) |
|---|---|---|
| 네임스페이스 | 값이 전역에 퍼짐 | 클래스 내부에서만 사용 가능 |
| 암묵적 변환 | 정수형으로 자동 변환 | 암묵적 변환 금지 (타입 안전성 증가) |
| 타입 충돌 가능성 | 높음 (같은 이름 사용 불가) | 낮음 (같은 이름 사용 가능) |
| 비트 연산 | 바로 사용 가능 | static_cast<int> 필요 |
| 기본 크기 | int (기본), char 등 지정 가능 | int (기본), 크기 지정 가능 |
| 타입 안전성 | 낮음 | 높음 |
| 코드 길이 | 짧음 | static_cast 필요로 인해 길어짐 |
enum class를 언제 사용할까?✅ 타입 안전성이 필요한 경우
✅ 이름 충돌을 방지하고 싶을 때
✅ 보다 깔끔한 코드 구조를 원할 때
✅ 명확한 네임스페이스 관리가 필요할 때
❌ 비트 연산을 자주 사용해야 한다면 기존 enum이 더 편리할 수도 있음.