C++에서 열거형(enum)은 상수를 그룹으로 묶어 코드의 가독성과 유지 보수성을 높이기 위해 자주 사용된다.
C++11부터는 enum class가 도입되면서 전통적인 enum의 몇 가지 문제점을 해결할 수 있게 되었는데,
이번 글에서는 enum과 enum 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++
'난 이 분야 전문가야! > C++' 카테고리의 다른 글
C++ :: 코테를 위한 STL 정리 (0) | 2023.07.14 |
---|