본문 바로가기
개발/C++ (98,03,11,14,17,20,23)

Before Classic C++ : enum

by snowoods 2025. 10. 27.

Before Classic C++

 

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 classenum struct는 기능적으로 완전히 동일합니다. C++11 표준에서 두 키워드는 같은 의미로 정의되었으므로, 어떤 것을 사용해도 타입에 안전한 열거형을 만들 수 있습니다. 선택은 개인이나 팀의 코딩 스타일에 따르며, 중요한 것은 프로젝트 내에서 일관성을 유지하는 것입니다.