본문 바로가기
Programing_Language/C++

enum과 enum class (열거 타입과 엄격한 열거 타입)

by neohtux 2020. 12. 6.
728x90

enum (열거형)

  • enum 타입 내부 멤버들에게 정수(int)값으로 이름을 붙일 때 사용한다.

  • 주로 내부 멤버이름을 대문자로 이름 짓는경우가 많다.
    • 각 열거자들의 값은 이전 열거자 값에 +1이 증가 된 값으로 알아서 할당된다.
      • ex) enum days {Sunday = 1 , Monday, Friday=10, Wednesday};
        Monday == 2 (True) , Wednesday == 11 (True)

  • 만약 enum 타입의 첫 번째 멤버에 값을 생략하면 컴파일러가 알아서 0부터 대입 해준다.

  • 실제 메모리를 잡아먹지 않는다. 단 열거자가 할당된 변수에 대해 메모리가 할당됨.

그럼 열거형을 쓰면 좋은점은? 왜 써요?

  • 위험한 상황(의도하지 않게 타입의 값이 변경되어 다르게 동작 하는 상황들)을 피할 수 있다.


  • 이 그림에서 유닛 타입에는 지상, 대공, 수중 유닛 3종류를 각각 1 , 2 , 3 을 이용해 구분 지었다.

    • slime이 생성될때 이 유닛은 지상유닛(Ground)이다.
    • 하지만 내부 코드나 실수에 의해 -1과 같이 유닛타입을 벗어나는 숫자가 대입되었다.
    • 이 경우 예상치 못한 유닛이 될 수 있다.. (물속에서 하늘을 공격하는 슬라임?...)

  • 열거형은 변수에 지정할 수 있는 값의 범위를 제한하기 때문에 이러한 문제를 방지할 수 있다.

  • 열거 타입에 일반 변수처럼 값을 직접 대입하거나 연산을 하는경우 대부분 컴파일러에서 경고나 에러를 발생시킨다.



enum class (더 엄격한 열거 타입)

  • enum class로 정의한 열거 타입은 유효 범위 (스코프)가 자동으로 확장 되지 않는다.

    • 값이 자동으로 증가하지 않는다는 말이 아니다.

  • 즉 아래 그림처럼 열거타입의 멤버 값 (그림에서는 UT_Ground, UT_antiAir, UT_UnderWater)을 사용할때마다 :: 스코프 지정 연산자를 붙여야 한다.



  • 아래 그림처럼 UnitType2::UT_Ground 이라고 하는 UnitType2의 범위연산자를 통해서 사용해야한다.



  • 또한 열거타입은 자동으로 정수타입으로 변환 되지 않는다. 그래서 아래 그림과 같은 표현은 불가능하다.




  • 열거타입은 정수 타입으로 저장 되지만, enum class UnitType2 :: unsigned long 과 같이 내부 표현 타입을 바꿀수 있다.

300x250

댓글