티스토리 뷰

 enum과 enum class가 있다. 둘의 차이는 범위가 있냐 없냐의 차이가 있다. 어떤 차이가 있는지 알아보자.

Scope 문제

일반적으로 중괄호 쌍이 정의하는 범위로 가시성이 정해지는데, enum의 경우에는 그렇지 않다. 예시를 보자.

enum Color { black, white, red };
auto white = false;  // 오류 white가 이미 선언되어 있음

white의 스코프 문제로 똑같은 white를 선언할 수가 없다. 하지만 범위 있는 enum은 그렇지 않다.

enum class Color { black, white, red };
auto white = false;
Color c = white;  // 오류 범위 안에 white라는 이름의 열거자가 없음
Color c = Color:white;

위의 코드보다 명확히 무엇을 지칭하는지 알기 쉬워졌다.

묵시적 변환 문제

 enum의 경우에는 묵시적으로 타입이 변환된다. 그래서 아래와 같은 코드를 컴파일러에서 잡지 못한다.

enum Color { black, white, red};

std::vector<std::size_t> primeFactors(std::size_t x);

Color c = red;

if(c < 14.5) {
    auto factors = primeFactors(c);
}

c가 정수형식으로 변환되기 때문에 float형으로도 변환이 가능해진다. 그러나 enum class의 경우에는 컴파일러가 먼저 에러를 찾는다. 그런데 만약 타입을 변환하고 싶다면 캐스팅을 사용해 타입을 변경하면 되므로 enum을 쓸 이유는 없다.

 

참고 서적

스콧 마이어스, Effective Modern C++

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함