C++시작과 문법

enum class 기본

이름 충돌과 암시적 정수 변환을 줄여 주는 `enum class`의 핵심 규칙을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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 classscope가 분리되고 타입 안정성이 더 높음
Color::red열거자에 접근할 때 소속 enum을 함께 씀
명시적 캐스팅정수값이 필요하면 static_cast로 변환
추천 용도상태, 모드, 옵션처럼 범주가 중요한 값

주의할 점

enum class는 안전하지만, 출력할 때 문자열이 자동으로 나오지는 않습니다. 사람이 읽는 로그가 필요하면 별도의 변환 함수나 switch를 함께 두는 편이 좋습니다.