포스트

[C++] enum class

[C++] enum class

C++의 enum vs enum class 정리


1. enum과 enum class의 정의

enum (전통적인 열거형, C 스타일)

1
2
3
4
5
enum Color {
    RED,
    GREEN,
    BLUE
};
  • 열거자(RED, GREEN, BLUE)가 전역 스코프에 노출됨
  • 열거자는 기본적으로 int로 취급되며 암묵적 형변환 가능
  • 이름 충돌 가능성 있음
  • 타입 안정성 낮음

enum class (스코프 열거형, C++11부터 도입)

1
2
3
4
5
enum class Color {
    RED,
    GREEN,
    BLUE
};
  • 열거자(RED, GREEN, BLUE)가 스코프 안에 있음
  • Color::RED처럼 명시적으로 접근해야 함
  • 암묵적 형변환이 불가능하여 타입 안전성이 높음
  • 이름 충돌 방지

2. enum과 enum class의 차이점

항목enumenum class
접근 방식전역 이름으로 접근 (예: RED)스코프를 통한 접근 (예: Color::RED)
형 변환int로 암묵적 변환 가능명시적 형변환만 가능
타입 안전성낮음높음
이름 충돌가능없음
사용 가능 버전C부터 가능C++11 이상에서 사용 가능

3. 스코프처럼 사용한다는 의미

전통 enum

1
2
3
4
5
6
enum Status {
    OK,
    ERROR
};

int a = OK;  // OK
  • 열거자 OK, ERROR가 전역에 존재함

enum class

1
2
3
4
5
6
7
enum class Status {
    OK,
    ERROR
};

int a = static_cast<int>(Status::OK);  // OK
int b = OK;          // 컴파일 에러
  • OK, ERRORStatus라는 이름 공간 안에 있는 스코프 멤버

4. 명시적 형변환 예시

1
2
3
enum class Mode { AUTO = 0, MANUAL = 1 };

int value = static_cast<int>(Mode::AUTO); // 명시적 변환만 가능

5. 이름 충돌 방지 예시

1
2
3
4
5
6
enum class Animal { DOG, CAT };
enum class Color { RED, GREEN };

Animal a = Animal::DOG;
// a = Color::RED;  // 컴파일 오류: 타입 불일치
// a = 0;           // 컴파일 오류: 암묵적 int 변환 불가

6. 요약

항목enumenum class
열거자 이름 접근전역에서 직접 접근열거형 이름을 통해 접근
스코프 구분없음있음
이름 충돌 가능성있음없음
타입 안전성낮음높음
int 변환암묵적명시적만 가능

결론: enum class는 스코프 제한과 타입 안전성을 제공하여 코드의 명확성과 안전성을 높이므로 일반적으로 enum class 사용이 권장.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.