
enum
개요
열거형(enum)은 서로 연관된 정수형 상수들의 집합에 의미 있는 이름을 부여하여 코드의 가독성과 유지보수성을 높이는 사용자 정의 타입입니다.
C++ 버전별 주요 키워드 도입 시기
- C99 이전 (C/C++): 전통적인
enum은 C 언어 초기부터 존재했습니다. - C++11: 타입 안전성을 강화하고 이름 충돌을 방지하는
enum class(또는enum struct)가 도입되었습니다. 또한, 열거형의 기반이 되는 정수 타입을 명시적으로 지정할 수 있게 되었습니다.
내용 설명
enum [열거명] { 상수명 [= 상수값], ... }; 형태로 선언합니다.
- 상수 값을 지정하지 않으면 첫 번째 상수는 0으로 시작하며, 이후 상수들은 이전 값보다 1씩 큰 값을 자동으로 갖게 됩니다.
- 전통적인
enum의 상수들은 전역 범위처럼 취급될 수 있어 이름 충돌의 위험이 있고, 정수 타입으로 암시적 변환이 가능합니다. - C++11의
enum class는 자체적인 스코프(scope)를 가지므로열거명::상수명형태로 접근해야 합니다. 또한, 정수 타입으로의 암시적 변환이 금지되어 타입 안전성이 매우 높습니다.
예제 코드
#include <iostream>
// 전통적인 enum
enum Color { RED, GREEN, BLUE }; // RED=0, GREEN=1, BLUE=2
// C++11 enum class
enum class Fruit { APPLE, BANANA, ORANGE };
int main() {
// 전통적인 enum 사용
Color myColor = BLUE;
std::cout << "--- Traditional enum ---" << std::endl;
if (myColor == BLUE) {
std::cout << "The color is BLUE." << std::endl;
}
// 정수로 암시적 변환 가능
std::cout << "Value of GREEN is: " << GREEN << std::endl;
// C++11 enum class 사용
Fruit myFruit = Fruit::APPLE;
std::cout << "\n--- C++11 enum class ---" << std::endl;
if (myFruit == Fruit::APPLE) {
std::cout << "The fruit is APPLE." << std::endl;
}
// 정수로 변환하려면 명시적 캐스팅 필요
int fruitValue = static_cast<int>(myFruit);
std::cout << "Value of APPLE is: " << fruitValue << std::endl;
return 0;
}
실행 결과
--- Traditional enum ---
The color is BLUE.
Value of GREEN is: 1
--- C++11 enum class ---
The fruit is APPLE.
Value of APPLE is: 0
활용팁
- 코드의 명확성과 타입 안전성을 위해 가급적 전통적인
enum보다는 C++11의enum class를 사용하는 것이 좋습니다. switch문과 함께 사용하면 특정 상태나 타입을 명확하게 구분하고 처리하는 코드를 작성할 수 있어 매우 유용합니다.enum class와enum struct는 기능적으로 완전히 동일합니다. C++11 표준에서 두 키워드는 같은 의미로 정의되었으므로, 어떤 것을 사용해도 타입에 안전한 열거형을 만들 수 있습니다. 선택은 개인이나 팀의 코딩 스타일에 따르며, 중요한 것은 프로젝트 내에서 일관성을 유지하는 것입니다.
'개발 > C++ (98,03,11,14,17,20,23)' 카테고리의 다른 글
| Before Classic C++ : Preprocessor (0) | 2025.10.30 |
|---|---|
| Before Classic C++ : Bitwise Operators (0) | 2025.10.29 |
| Before Classic C++ : Conditional Operator (1) | 2025.10.28 |
| Before Classic C++ : Comma Operator (0) | 2025.10.26 |
| Before Classic C++ : goto (1) | 2025.10.25 |
| Before Classic C++ : continue (0) | 2025.10.24 |
| Before Classic C++ : break (1) | 2025.10.23 |
| Modern C++ : std::exception (98, 11) (0) | 2025.10.22 |