Scoped enum 이란것은 C++11에서 새로 나온 enum 선언 방식이다. 문법은 enum class EnumName이다. 기존 문법은 enum EnumName이다. 무엇이 달라졌을까?

  1. enumerator의 범위
  2. 암묵적인 타입 변환 불가능
  3. 크기 지정
  4. 전방 선언

enumerator의 범위

enum class 로 선언된 enum은 범위 밖에서 enumerator로 접근할 수 없다.


enum class Color { Red, Green, Blue };
// 이 곳에서는 Red, Green, Blue 에 접근할 수 없다.
Color color = Color::Red; // 이렇게 접근하여야 한다.
double Red = 10; // 이름이 겹치지 않기 때문에 enumerator 를 변수명으로 사용할 수 있다.
enum class OtherColor { White, Black, Red }; // Color 와 독립적인 enum 이기 때문에 Red를 사요할 수 있다.

암묵적인 타입 변환 불가능

enum class 는 int가 아니다. 따라서 double 등 다른 타입으로 암묵적인 형 변환이 되지 않는다.


double red = Color::Red; // 에러!
Color color = Color::Green;
if (color > 10.5) // 에러!
if (static_cast(color) > 10.5) // 정상.. -_-;;

크기 지정

enum class 는 사용자가 enum의 크기를 직접 지정할 수 있다. 기본값은 int 이다.


// 크기 지정
enum class Color : std::uint8_t { Red, Green, Blue };

전방 선언

앞서 얘기한 크기 지정 덕분에 전방 선언도 가능하다. 컴파일러가 크기를 알 수 있기 때문이다. 사실 전방선언을 하기 위해서 크기를 지정할 수 있도록 했는지도 모르겠다. 그런가? 방법은 간단하다.

전방선언을 하게 되면 코드들의 종속성이 줄어들어 enumerator 를 수정했다고 해서 관련된 모든 코드를 컴파일 하지 않는다는 것이다.


enum class Color; // 전방 선언
enum class Color : std::uint8_t; // 크기 지정한 전방 선언