본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Modern C++ : enum vs enum class (98, 11)

by snowoods 2025. 8. 2.

Modern C++

 

 

enum vs enum class

 

개요

C++98의 전통적 enum과 C++11에서 도입된 enum class(Scoped enum)를 비교하여, 각 방식의 특징, 장단점 및 사용 시 유의점을 정리한다.

 

C++ 버전별 주요 키워드 도입 시기

  • C++98: enum
  • C++11: enum class Name : UnderlyingType (기반 타입 지정)

 

내용 설명

  1. 전통적 enum (C++98)
    • 암시적 정수 변환 허용 → 타입 안전성 부족
    • 열거자 이름이 전역 범위 오염 → 충돌 위험
    • 기반 타입 지정 불가 (기본 int)
  2. 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