C++ enum class란? 그리고 enum class 사용하면 좋은 이유?
#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를 사용하는 것이 좋습니다.