본문 바로가기

난 이 분야 전문가야!/C++

C++ :: 열거형 enum과 enum class

728x90

C++에서 열거형(enum)은 상수를 그룹으로 묶어 코드의 가독성과 유지 보수성을 높이기 위해 자주 사용된다.

C++11부터는 enum class가 도입되면서 전통적인 enum의 몇 가지 문제점을 해결할 수 있게 되었는데,

이번 글에서는 enumenum class의 차이점과 각각의 장단점을 살펴보려 한다.

 

1. 기본 문법 및 선언 방법

전통적인 enum

전통적인 열거형은 다음과 같이 선언한다:

enum Color {
    Red,
    Green,
    Blue
};

 

이렇게 선언하면 Red, Green, Blue는 전역 네임스페이스(혹은 선언된 스코프)에 직접적으로 노출된다.

 

enum class

C++11부터 도입된 enum class는 좀 더 강력한 타입 안정성을 제공한다.

enum class Color {
    Red,
    Green,
    Blue
};

 

enum class를 사용하면 열거형 상수가 자신만의 스코프를 갖게 되어, 다른 이름과의 충돌을 방지할 수 있다.

 

2. 스코프(scope)와 이름 충돌

전통적인 enum의 문제점

전통적인 enum은 열거형 상수들이 전역 혹은 외부 스코프에 노출되므로 이름이 다른 열거형과 충돌할 위험이 있다.

예를 들어:

enum Color {
    Red,
    Green,
    Blue
};

enum TrafficLight {
    Red,    // 이름 중복 발생!
    Yellow,
    Green   // 이름 중복 발생!
};

 

이처럼 Red와 Green이 두 번 선언되어 컴파일 에러나 의도치 않은 동작이 발생할 수 있다.

 

enum class의 장점

enum class는 열거형 상수들을 해당 열거형의 스코프 내부에 캡슐화하기 때문에 이름 충돌 문제가 발생하지 않는다.

enum class Color {
    Red,
    Green,
    Blue
};

enum class TrafficLight {
    Red,
    Yellow,
    Green
};

// 사용 시
Color myColor = Color::Red;
TrafficLight light = TrafficLight::Red;

 

이렇게 하면 두 열거형의 상수들이 각각의 스코프에 존재하므로

Color::Red와 TrafficLight::Red로 구분하여 사용할 수 있다.

 

3. 타입 안정성(Type Safety)

전통적인 enum의 특징

전통적인 enum은 암시적 형 변환을 허용한다.

열거형 상수는 내부적으로 정수형 값을 가지며, 다른 정수형 변수와 자유롭게 교환될 수 있다.

enum Color {
    Red,
    Green,
    Blue
};

int value = Red; // 암시적으로 int로 변환됨

 

이러한 암시적 형 변환은 때때로 의도치 않은 버그를 발생시킬 수 있다.

 

enum class의 특징

enum class는 강한 타입 안정성을 제공한다.

즉, 열거형 상수를 명시적으로 변환하지 않으면 다른 타입과의 암시적 변환이 불가능하다.

enum class Color {
    Red,
    Green,
    Blue
};

int value = Color::Red; // 컴파일 에러: 암시적 형 변환 불가
// 만약 정수형 값으로 변환하고 싶다면 명시적으로 static_cast 사용
int value = static_cast<int>(Color::Red);

 

이렇게 함으로써, 의도하지 않은 변환으로 인한 오류를 줄일 수 있다.

 

4. 기본 자료형 지정

전통적인 enum

전통적인 enum은 내부 표현을 정수형으로 사용하지만, 정확한 자료형은 구현에 따라 달라질 수 있다.

따라서 자료형의 크기를 명확히 지정할 수 없다.

 

enum class

enum class는 선언 시 기본 자료형을 지정할 수 있다.

이를 통해 메모리 사용량과 범위를 명확히 할 수 있다.

enum class Color : unsigned char {
    Red,
    Green,
    Blue
};

자료형을 명시적으로 지정하면, 해당 열거형이 사용할 메모리의 크기와 범위를 개발자가 직접 제어할 수 있다.

 

5. 요약

스코프:

enum: 상수들이 전역(또는 외부) 스코프에 노출되어 이름 충돌 가능
enum class: 열거형 상수가 자체 스코프를 가지므로 이름 충돌 방지

타입 안정성:

enum: 암시적 형 변환 허용, 타입 안정성이 떨어짐
enum class: 암시적 형 변환 불가, 명시적 변환만 가능하여 타입 안정성이 높음

기본 자료형 지정:

enum: 내부 자료형이 구현에 따라 달라짐
enum class: 기본 자료형을 명시적으로 지정 가능

 

 

 

참고문헌

- 전문가를 위한 c++

728x90

'난 이 분야 전문가야! > C++' 카테고리의 다른 글

C++ :: 코테를 위한 STL 정리  (0) 2023.07.14