C++ 11에서 등장한 enum class와 기존 enum의 차이점을 알아보자
서로 다른 enum 타입끼리도 비교가 가능하다는 불편함이 있었음
예를 들어,
enum COLOR {
RED, // 0
GREEN, // 1
BLUE, // 2
E1 // 3
};
enum ANIMAL {
CAT, // 0
DOG, // 1
TIGER // 2
E2 // 3 (다른 enum 멤버의 이름과 중복될 수 없음
};
void main() {
COLOR c = RED;
ANIMAL a = DOG;
int n = c; // n에 0이 들어감
/*
enum COLOR 타입과 enum ANIMAL 타입을 비교하는 코드를 넣어도
정상적으로 작동함
*/
}
위 코드에는
1. 서로 다른 enum 간 멤버 이름이 중복될 수 없다
2. 서로 다른 enum 타입 간 비교가 가능하다
3. 기본적으로 int타입이다.
라는 문제점이 있다.
(코딩할 때 컬러와 동물을 비교하겠다는 로직은 일반적으로 짜지 않으니...)
이를 보완하기 위해 나온 것이 C++11에서 등장한 enum class
enum class COLOR {
RED,
GREEN,
BLUE,
E
};
enum class ANIMAL {
CAT,
DOG,
TIGER,
E
};
void main() {
COLOR c = COLOR::RED;
ANIMAL a = ANIMAL::CAT;
// int a = DOG 선언 시 ERROR
/*
c와 a를 비교하는 코드 실행 시
에러남
*/
}
또한 int 외에 정수형 타입을 정해줄 수 있다
enum class ANIMAL : int8_t {};
enum class COLOR : int16_t {};
결론 : enum class를 애용하도록 하자 (사실 난 한 개의 enum만 쓸 땐 걍 enum 쓰긴 함)