혼자 언리얼을 공부하다가 Enum을 만들 일이 생겼다.
근데 C++ 새로운 표준에 enum class가 생겼고 C에서부터 있었던 enum보다는 enum class를 타입안전성때문에 사용해야 한다는 말은 알고 있었지만 예를 들라고 하면 못 들 정도로 얄팍하지 않나 싶은 생각이 들었다.
그래서 이김에 확고히 하고 간다.
우선 enum은 내부적으로 int이다.
그래서 int, 혹은 다른 enum과 연산이 가능하다.
기존의 C++의 enum은 내부적으로 int와 동일하게 사용되고, 바로 int형 변수와 비교도 하고 서로 다른 enum 끼리도 비교가 가능했다.
출처: https://unikys.tistory.com/376 [All-round programmer]
그리고 스코프에 대한 문제도 있었다.
일반 enum을 선언하면 그냥 namespace(?)같은 제한없이 사용이 가능하다.
// An example program to demonstrate working
// of enum in C
#include<stdio.h>
enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};
int main()
{
enum week day;
day = Wed;
printf("%d",day);
return 0;
}
그리고 일반 enum은 다른 enum과도 이름이 겹쳐서는 안된다.
// 컴파일 오류 발생!
enum Color
{
RED,
GREEN,
BLUE
};
enum
TrafficLight
{
GREEN, // 오류
YELLOW,
RED // 오류
};
그래서 스코프 문제와 타입문제를 해결한 것이 enum class이다.
// 컴파일 오류 발생!
enum Color
{
RED,
GREEN,
BLUE
};
enum class TrafficLight
{
GREEN,
YELLOW,
RED
};
Color background = RED; // ok
Color foreground = Color::BLUE; // C++98 error, C++11 ok
Color fontColor = TrafficLight::RED; // error
TrafficLight stop = RED; // error
TrafficLight go = TrafficLight::GREEN; // ok
enum class는 반드시 스코프를 명시해줘야 한다.
그리고 int등으로 암시적 변환이 일어나지 않는다.
int rgb = RED; // 일반 enum은 가능
int traffic = TrafficLight::RED; // error, 자동 변환 허용 안함
int yield = static_cast<int>(TrafficLight::Yellow); // ok
명시적으로 형변환을 해줘야 한다.
class와 같이 선언만 따로 할 수 있도록 해준다.
enum class TrafficeColor;
class TrafficLight
{
public:
TrafficLight currentLightColor;
}
일반 enum은 struct의 멤버로 설정하게 되면 컴파일하는 환경마다 struct의 크기가 달라질 수 있었다.
그래서 int 혹은 char 크기라고 명시적으로 정의할 수 있게 enum class는 기능을 제공한다.
enum class TrafficLight : char
{
RED,
YELLOW,
GREEN
}