C++/Syntax 2021. 3. 10. 21:12

열거형 (Enumerate Type)

unscoped enum

  • C++98

  • 범위에 제한이 없어 모든 namespace에 선언된다.

    • 따라서 이름이 중복되면 안된다.
  • 정수 타입으로 묵시적 형변환된다.

  • enum 변수에 숫자를 넣으려면 캐스팅을 해야 한다.

    #include <iostream>
    
    enum Color
    {
        COLOR_BLACK,
        COLOR_RED,
        COLOR_BLUE,
        COLOR_GREEN
    };
    
    int main()
    {
        using namespace std;
    
        int color_id = COLOR_RED;
        Color my_color1 = static_cast<Color>(color_id);
        Color my_color2 = static_cast<Color>(3);
        if (my_color1 < 2)
            cout << my_color1 << ' ' << my_color2 << endl;
    }
  • VS에서 작성 시 unscoped enum을 사용했다는 경고가 발생한다.


scoped enum

  • enum class

  • C++11

  • 영역을 제한해준다.

  • 묵시적 형변환을 허용하지 않는다.

  • 전방 선언 가능

    • C++98에서 unscoped enum은 전방선언 불가

      • 컴파일러가 숨겨진 타입을 모르기 때문이다.
    #include <iostream>
    
    enum class Color
    {
        COLOR_BLACK,
        COLOR_RED,
        COLOR_BLUE,
        COLOR_GREEN
    };
    
    int main()
    {
        using namespace std;
    
        int color_id = static_cast<int>(Color::COLOR_RED);
        Color my_color1 = static_cast<Color>(color_id);
        Color my_color2 = static_cast<Color>(3);
        if (my_color1 < static_cast<Color>(2))
            cout << static_cast<int>(my_color1) << ' ' \
                << static_cast<int>(my_color2) << endl;
    }
  • 숨겨진 타입(underlying type)이 기본적으로 int 타입이다.

    • 직접 타입을 명시할 수 있다.

      enum class Color : uint32_t
      {
          COLOR_BLACK,
          COLOR_RED,
          COLOR_BLUE,
          COLOR_GREEN
      };
    • C++11에서 unscoped enum을 전방선언하는 방법

      • 숨겨진 타입을 직접 명시하면, 컴파일러가 enum의 숨겨진 타입을 알 수 있으므로 가능하다.

        enum Color : std::uint32_t;

'C++ > Syntax' 카테고리의 다른 글

C++ 제어 흐름 (Control Flow)  (0) 2021.03.11
C++ Type Alias  (0) 2021.03.11
C++ 형변환 (Type Conversion)  (0) 2021.03.10
C++ 자료형 추론 (auto, decltype)  (0) 2021.03.10
C++ using  (0) 2021.03.10