요약
-
기존 C++ 의 enum은 type safe하지 않다. 즉, 형식이 안전하지 않다!
-
이에 반해 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
핵심
-
C++ 11은 두 종류의 enum 으로 바뀌었다.
-
unscoped enumeration
-
scoped enum
-
기존의 enum을 보완하여, C++11에서 enum은 type safe하다.
unscoped enumeration
-
기존 C++ 03의 enum과 비슷
-
예시
scoped enum
-
class 키워드를 붙임 : enum class eColor {...
-
예시
'Dev Language > Modern C++ (C++11, 14)' 카테고리의 다른 글
C++ 11 : 지연 평가 (0) | 2020.08.08 |
---|---|
C++ 11 : 일급 함수 (1)다른 함수의 매개변수로 함수 전달 (0) | 2020.08.08 |
C++ 11 : nullptr (0) | 2020.08.08 |
C++ 11 : std::function 함수 객체? 함수면 함수고 객체면 객체인데, 함수 객체는 무엇인가 ? (0) | 2020.08.08 |
C++ 11 : auto_ptr (0) | 2020.08.08 |