C++

C++ enum class란? 그리고 enum class 사용하면 좋은 이유?

코딩샐러드 2024. 2. 5. 16:23

#enum #enum_class

enum class란?

C++에서 enum class는 열거형을 나타내는 특별한 형태 중 하나 입니다.

enum class는 열거형의 범위(scope)를 제한하여 이름 충돌을 방지하고, 보다 강력한 타입 체크를 제공합니다.

예를 들어:

enum class Color {
    Red,
    Green,
    Blue
};

int main() {
    Color myColor = Color::Red;

    switch (myColor) {
        case Color::Red:
            // 빨간색 처리
            break;
        case Color::Green:
            // 초록색 처리
            break;
        case Color::Blue:
            // 파란색 처리
            break;
    }

    return 0;
}

여기서 Color::Red, Color::Green, Color::Blue와 같이 열거형 멤버는 Color라는 클래스의 멤버로 지정되어 있습니다. 이렇게 하면 다른 열거형에서 동일한 이름을 사용할 수 있으며, 타입 안전성이 높아집니다.

enum class 사용 해야 하는 이유

C++에서는 C-style enum 대신에 enum class를 사용하면 다양한 이점을 얻을 수 있습니다. 다음은 그 중 몇 가지입니다:

타입 안전성(Type Safety)

enum class는 C++에서 제공하는 강력한 타입 안전성을 제공합니다. 이는 enum class의 값을 다른 타입의 값으로 임의로 변환할 수 없다는 것을 의미합니다. 이로 인해 프로그램의 버그를 줄일 수 있습니다.

#include <iostream>

enum class _myColor_enumclass {
  ec_color_red = 1,
  ec_color_yellow = 2,
  ec_color_green = 3,
};

typedef enum _myColor_enum {
  e_color_red = 1,
  e_color_yellow = 2,
  e_color_green = 3,
} myColor_enum;

int main() {

  // int EC_Color = static_cast<int>(_myColor_enumclass::ec_color_green);
  int EC_Color = _myColor_enumclass::ec_color_green;
  int E_Color = e_color_green;

  std::cout << EC_Color << std::endl;
  std::cout << E_Color << std::endl;

  return 0;
}

범위 지정(Scoped Enumerations)

C-style enum은 전역 네임스페이스에서 동작하지만, enum class는 자체적인 범위를 가집니다. 이는 이름 충돌을 방지하는 데 도움이 됩니다.

// _myColor_enumclass 변수에 값을 할당
_myColor_enumclass EC_Color = _myColor_enumclass::ec_color_green;
// int 변수에 static_cast<int> 사용해서 값을 할당
 int EC_Color = static_cast<int>(_myColor_enumclass::ec_color_green);

내재형 지정(Underlying Type Specification)

C++에서는 enum class를 선언할 때 underlying type을 명시적으로 지정할 수 있습니다. 이를 통해 메모리 사용량을 줄일 수 있습니다.

cppenum class MyEnum : uint16_t {
    Value1,
    Value2,
    // 더 많은 값들..
};

코드의 가독성(Readability)

enum class를 사용하면, 코드에 더 많은 의미를 부여할 수 있습니다. 이는 코드의 가독성을 높이고 유지 보수를 용이하게 합니다.

컴파일러 지원(Compiler Support)

일부 컴파일러는 enum class를 사용하면 추가적인 컴파일 시간 체크를 제공합니다. 이는 잘못된 코드를 더 빨리 감지하는 데 도움이 됩니다.

이러한 이유로, C++에서는 가능하면 C-style enum 대신에 enum class를 사용하는 것이 좋습니다.