프로그래밍/cpp

타입 세이프한 열거 타입 enum class <c++11>

콘파냐 2015. 7. 7. 14:49

데이터의 집합을 읽어 들일 때 인간은 문자를 컴퓨터는 숫자를 선호한다. 

이를 위한 형태가 enum이라는 열거 타입인데, C언어 문법이고, 타입 세이프하지는 않다. 

이에 반해 c++11에 등장한 enum class는 타입 세이프한 녀석이다.

 


enum

enum은 내부에 열거된 변수에 0부터 차례대로 숫자를 입힌다. 물론 도중에 값을 변경시켜도 된다. 변경된 수 다음 수는 변경된 수를 기준으로 1식 증가된다.

 

enum 활용 예

컴파일은 되지만 문제가 되는 부분은 if(mine==yours)를 비교하는 부분이다. 서로 다른 종류의 값들을 다루지만 서로 비교가 가능하다. 이는 타입 세이프 하지 않다는 것을 반증한다.

 

myType과 yourType은 의도대로 라면 다른 종류의 값들이어야 한다. 하지만 enum은 내부 값을 숫자를 열거하여 표현한다.

그렇다고 값 자체가 숫자를 표현하지는 않는다. enum은 다음과 같은 형식의 사용은 방지하게 해준다.

하지만 컴파일 타임에 열거 타입들은 자동으로 형 변환이 일어나 숫자로 변화되기 때문에 두 열거 타입을 비교하는 경우에는 에러 없이 넘어가는 것이다.

또한 변수가 내포한 열거 값(숫자)들이 출력 된다.해결책은 enum class다.

 

enum class

<c++11> 문법 (GCC컴파일러를 사용한다면 컴파일 시에 –std=c++11 옵션을 넣는다.)

enum을 enum class 로 바꾸기만 하면 된다. 이 녀석은 타입 세이프한 녀석이다 위 소스의 열거 타입을 enum class로 대체하면

 

:: 스코프 지정자

enum class의 열거형 변수들을 사용하려면 ::를 사용해야 한다.

:: 스코프 지정자를 사용하기 때문에 타입 세이프할 수밖에 없다.

다음은 원래의 소스에 스코프 지정자를 전부 사용한 모습이다.

비교도 내부 열거된 숫자 값도 알 수 가 없다. 때문에 출력을 할 수가 없고, 정의되지 않은 <<연산자의 사용이 불가 하다.

비교가 되기 위해서는 위와 같은 방법 뿐이다.

반응형