반응형

Modern C++에서 Enumeratorsenum class의 활용법


Modern C++에서는 열거형(enumerator)의 타입 안전성과 편의성을 강화하기 위해 enum class를 도입했습니다.

또한, 반복(iteration)이나 문자열 변환 같은 작업을 더 효과적으로 수행할 수 있는 기법도 지원됩니다.

본 글에서는 enum class의 특징, 활용법, 반복자 구현, 문자열 변환, 그리고 C++20 이후의 Reflection 기반 작업에 대해 다룹니다.


1. 기본 enumenum class의 차이

기존의 C 스타일 enum은 암시적으로 정수형으로 변환될 수 있으며, 네임스페이스 내에서 이름 충돌이 발생할 가능성이 있습니다.

cpp

// Modern C++ 이전 enum 
enum Color { Red, Green, Blue };  // 암시적으로 정수형
Color c = Red;
int value = c;  // 암시적 변환 허용
  • Modern C++의 enum class타입 안전스코프 분리 를 제공합니다!

cpp

// Modern C++ enum class
enum class Color { Red, Green, Blue };

Color c = Color::Red;  // 명시적으로 접근 필요
int value = static_cast<int>(c);  // 명시적 변환 필요

2. 저장 타입 지정

enum class는 저장 타입을 명시적으로 지정할 수 있어 메모리 사용을 최적화하거나 특정 크기 요구 사항을 만족시킬 수 있습니다.

cpp

enum class Color : uint8_t { Red, Green, Blue };

3. 열거형 요소 반복

C++은 열거형 요소를 자동으로 반복하는 기능을 내장하지 않지만, std::array와 사용자 정의 반복자를 활용해 이를 구현할 수 있습니다.

cpp

#include <iostream>
#include <array>

enum class Color { Red, Green, Blue, Count };

std::ostream& operator<<(std::ostream& os, Color color) {
    switch (color) {
        case Color::Red: return os << "Red";
        case Color::Green: return os << "Green";
        case Color::Blue: return os << "Blue";
        default: return os << "Unknown";
    }
}

int main() {
    for (int i = 0; i < static_cast<int>(Color::Count); ++i) {
        std::cout << static_cast<Color>(i) << '\n';
    }
    return 0;
}

4. 열거형과 문자열 변환

열거형을 문자열로 변환하는 기능은 C++ 표준에 포함되지 않았으므로 보통 매크로나 사용자 정의 함수를 사용합니다.

cpp

#define ENUM_TO_STRING_CASE(x) case x: return #x;

const char* ToString(Color color) {
    switch (color) {
        ENUM_TO_STRING_CASE(Color::Red)
        ENUM_TO_STRING_CASE(Color::Green)
        ENUM_TO_STRING_CASE(Color::Blue)
        default: return "Unknown";
    }
}

5. Reflection과 열거형 작업

C++20 이후에는 Reflection 관련 라이브러리(magic_enum 등)를 활용해 열거형 요소를 더 쉽게 탐색하거나 변환할 수 있습니다.

magic_enum GitHub

magic_enum 사용 예:

cpp

#include <magic_enum.hpp>
#include <iostream>

enum class Color { Red, Green, Blue };

int main() {
    for (auto color : magic_enum::enum_values<Color>()) {
        std::cout << magic_enum::enum_name(color) << '\n';
    }
    return 0;
}

이 라이브러리를 사용하면 열거형 반복, 문자열 변환, 요소 이름 탐색이 간단해집니다.


참고 자료


이 글은 Modern C++에서 열거형 작업을 최적화하고 코드의 가독성을 높이는 방법을 제안합니다.

다양한 라이브러리와 문서를 참고해 더 깊이 있는 개발 환경을 구축해보세요! 👍

728x90
반응형

+ Recent posts