enum vs enum class

원아담·2022년 6월 10일
0

공부.CPP

목록 보기
1/2
post-thumbnail

혼자 언리얼을 공부하다가 Enum을 만들 일이 생겼다.

근데 C++ 새로운 표준에 enum class가 생겼고 C에서부터 있었던 enum보다는 enum class를 타입안전성때문에 사용해야 한다는 말은 알고 있었지만 예를 들라고 하면 못 들 정도로 얄팍하지 않나 싶은 생각이 들었다.

그래서 이김에 확고히 하고 간다.

enum의 문제점

우선 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 class이다.

스코프를 생성하는 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
}


profile
게임 만드는 사람

0개의 댓글

관련 채용 정보