본문 바로가기
프로그래밍/C++

C++ ] enum class 사용법

by eteo 2023. 10. 3.
반응형

 

enum class 선언

 

enum class를 정의할 때 명시적으로 기본 타입을 지정하지 않으면 int 형으로 설정된다.

또한 첫번째 멤버의 값을 지정하지 않은 경우 첫번째 멤버는 0으로 초기화되고 그 다음 멤버는 1씩 증가한다.

 

enum class MyEnum {
    VALUE1,
    VALUE2,
    VALUE3
};

 

 

 

 

열거형 멤버 접근

 

:: 연산자를 사용해 접근한다.

 

MyEnum myVar = MyEnum::VALUE1;

 

 

 

 

 

정수값으로 변환

 

enum 클래스의 기본 타입이 int라고 해도 바로 정수값으로 변환되지는 않기 때문에 형변환 연산자를 사용해야 한다.

 

int intValue = 0;
MyEnum enumValue = MyEnum::VALUE1;

if (intValue == enumValue) { // 오류! 비교 불가능
    // ...
}

// 형변환 필요
int valueAsInt = static_cast<int>(myVar);

 

 

 

 

 

스위치문과 enum class

 

다음과 같이 사용할 수 있다.

switch (myVar) {
    case MyEnum::VALUE1:
        // 처리 코드
        break;
    case MyEnum::VALUE2:
        // 처리 코드
        break;
    case MyEnum::VALUE3:
        // 처리 코드
        break;
}

 

 

 

 

enum class의 범위제한

 

enum class는 멤버에 접근할때 항상 "enum class명::멤버"로 접근하기 때문에 다른 열거형끼리 멤버이름이 같더라도 충돌할 일은 없다.

 

enum class TrafficLight {
    RED,
    YELLOW,
    GREEN
};

enum class Signal {
    RED,
    YELLOW,
    GREEN
};

 

 

 

 

 

int 외 다른 정수 형식으로 enum class 정의하기

 

선언시 : 연산자 뒤에 short, char, unsigned int 등을 써서 다른 정수형식으로 지정하는 것이 가능하다. 이렇게 정수 형식을 명시하면 해당 열거형의 크기가 형식에 맞게 조절된다.

 

enum class MyShortEnum : short {
    VALUE1 = 0,
    VALUE2,
    VALUE3
};

 

 

 

 

 

언제 enum class를 쓰는 게 유리한가

enum class는 타입 안정성과 네임스페이스 충돌 방지 면에서 명확한 장점을 가지고 있지만, 반대로 매번 static_cast를 통해 형변환해야 하거나, 비교 시에도 타입 일치가 필요해 코드가 장황해질 수 있다.

그래서 단순한 상태 구분, 비트 마스크, 플래그 값 용도에서는 여전히 C 스타일 enum을 쓰는게 간결하고 편할 때가 많다. 하지만 서로 다른 열거형의 멤버 이름이 충돌할 위험이 있는 경우, 또는 함수 파라미터나 반환값에서 열거형 타입을 명확히 제한하려는 경우에는 enum class를 사용하는 것이 유리할 것이다.

반응형