75. C++ 열거형

75. C++ 열거형 (enum, enum class)

1. 개요

1.1 문서 개요

이 문서는 C++에서 제공하는 열거형(enum) 타입의 두 가지 형태인 전통적인 enum과 C++11 이후 도입된 enum class에 대해 정리합니다. 열거형은 관련 상수들을 그룹화하여 이름 있는 타입으로 정의할 수 있는 기능으로, 코드의 가독성과 안정성을 높이는 데 사용됩니다.

2. 내용

2.1 전통적인 enum

2.1.1 선언 방식

기존의 enum은 다음과 같은 형식으로 선언합니다.

enum Color {
    RED,
    GREEN,
    BLUE
};

2.1.2 사용 예

Color c = RED;

2.1.3 내부 동작

기본적으로 enum은 정수형(int)으로 취급되며, 열거자 값은 0부터 시작하여 자동 증가합니다.

enum Direction {
    NORTH = 1,
    EAST,  // 2
    SOUTH, // 3
    WEST   // 4
};

2.2 enum의 단점

  • 이름 충돌 위험: 동일한 스코프 내에서 중복 이름 가능
  • 암묵적인 정수형 변환 가능성: 타입 안정성이 낮음
enum Status { OK, FAIL };
int a = OK; // 암묵적 형 변환 허용

2.3 enum class (Scoped Enumeration)

2.3.1 개념 및 선언

C++11부터 도입된 enum class는 스코프를 갖는 열거형으로, 열거자들이 외부에 노출되지 않습니다.

enum class Color {
    RED,
    GREEN,
    BLUE
};

2.3.2 사용 방식

Color c = Color::RED;

2.3.3 장점

  • 열거자 이름 충돌 방지
  • 암묵적 정수형 변환 금지
  • 명확한 타입 구분
int n = static_cast<int>(Color::GREEN); // 명시적 변환 필요

2.4 열거형의 기본형 지정

C++11 이후 enumenum class 모두 기본 저장 타입을 지정할 수 있습니다.

enum class ErrorCode : uint8_t {
    OK = 0,
    WARNING = 1,
    ERROR = 255
};

이 기능을 통해 메모리 최적화 및 외부 시스템과의 호환성을 높일 수 있습니다.

2.5 열거형을 활용한 switch 문

enum class Mode { AUTO, MANUAL };

Mode m = Mode::AUTO;

switch (m) {
    case Mode::AUTO:
        // 자동 모드 처리
        break;
    case Mode::MANUAL:
        // 수동 모드 처리
        break;
}

3. 마무리

C++에서 열거형은 상수 집합을 명확한 타입으로 표현할 수 있는 수단이며, enum class는 전통적인 enum의 한계를 극복하고 타입 안전성과 범위 제한을 제공하는 진화된 형태입니다. 스코프 충돌 방지, 정수형 변환 제한 등의 특성을 통해 현대 C++ 스타일에 더욱 적합한 열거형 표현이 가능합니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

error: Content is protected !!
위로 스크롤