본문 바로가기
Dev Language/Modern C++ (C++11, 14)

C++ 11 : 열거타입 enum

by 미티치 2020. 8. 8.

요약

  1. 기존 C++ 의 enum은 type safe하지 않다. 즉, 형식이 안전하지 않다!

  2. 이에 반해 C++ 11에서 새로 나온 enum class는 type safe하다.

 

 


내용 1. 기존 enumeration 

C++ 11 이전에 enum은 다음과 같다. 아래 두가지 enum을 선언했다고 가정하자

typedef enum
{
    APPLE,
    BANANA,
    KIWI,
} eFruit;

typedef enum
{
    RED,
    YELLOW,
    GREEN,
} eColor;
int main( )
{
    eColor    color = RED;
    eFruit    fruit = APPLE;

    if( color == fruit )
    ...
}

문제가 되는 부분은 if ( color == fruit ) 부분이다. C++은 color 와 fruit을 비교할 때, color와 fruit을 암시적으로 정수로 변환하고 정수 값을 비교한다.

이부분에서 문제가 되는 포인트는 2가지인 것 같다.

 

하나는, 

결국 C++에서 정수 값으로 바꾸고, 여기서는 디폴트 0으로 설정된 APPLE 값과 RED 값이 같기 때문에! 저 if문의 조건문은 true이다. 이것은 내가 원하는 동작이 아니라는 것. 나의 의도대로라면 color와 fruit은 다른 종류의 값들이어야 한다

  • 여기서 하나 더 짚고넘어가야할 부분은, C++에서 enum을 정수 값으로 바꾸고 비교는 하지만 enum 값 자체가 숫자를 표현하지는 않는다는 것! 이게 무슨말이냐면 eColor color = 3; 이건 불가능하다는 뜻이다. (너무 당연한 소리인가.. enum은 이걸 방지하게 하려고 쓰는건데)

  • 컴파일 타임에 열거 타입들은 자동으로 정수로 변환되기 때문에 이 if문 조건검사가 문제 없이 수행이된다. 결국 이부분이 문제라는 것! 다시 한번 강조

 

두번째는, 

C++에서 enum으로 선언한 변수들끼리 서로 다른 종류의 값들을 다루지만, 서로 비교가 가능하다. 의미적문제

=> type unsafe하다.


내용 2. C++11의 enumeration 

 

핵심

  1. C++ 11은 두 종류의 enum 으로 바뀌었다.

    • unscoped enumeration

    • scoped enum

  2. 기존의 enum을 보완하여, C++11에서 enum은 type safe하다.


unscoped enumeration

  • 기존 C++ 03의 enum과 비슷

  • 예시

 

scoped enum

  • class 키워드를 붙임 : enum class eColor {...

  • 예시