C++11에서 'scoped enums' 메커니즘이 도입되었습니다 — 키워드 enum class.
전통적인 enum과의 주요 차이점:
enum class MyE : uint8_t { ... };).필요한 이유: 타입 안전성을 높이고, 이름 충돌 및 잘못된 비교를 방지하며, 저장 관리를 명시적으로 제어하기 위해.
예시:
enum Color { Red, Green }; Color c = Red; // 일반 enum, Red는 전역적으로 보입니다. enum class State { Off, On }; State s = State::On; // State::On을 명시적으로 지정해야 합니다.
작성할 수 없는 코드:
enum class State { Off, On }; int x = State::On; // 오류! 명시적인 변환이 필요합니다. int y = static_cast<int>(State::Off); // 괜찮습니다.
왜 enum class의 값이 이름과 기본 타입이 같은 경우에도 서로 다른 enum class의 값들끼리 논리 비교를 할 수 없나요?
답변:
타입 안전성: 각 enum class는 고유한 타입을 가지며, 기본 타입이 동일하고 열거자가 이름이 동일하더라도 컴파일러는 이를 다른 타입으로 인식하고 암시적인 비교를 허용하지 않습니다.
사례
기계 제어 프로젝트에서 enum에서 enum class로 전환할 때, 로그 출력 시 명시적 변환을 추가하는 것을 잊어버렸습니다. 로그는 "이질적인" 값을 보여주기 시작하여 (State::On을 숫자로 인식하지 못함) 디버깅이 복잡해졌습니다.
사례
REST 서비스에서 일반 enum을 enum class로 마이그레이션한 후, 코드가 서로 다른 enum class의 다양한 열거형 값을 비교했습니다. 컴파일러는 이를 허용하지 않아 자동 테스트가 실패했습니다.
사례
감사 시스템에서 개발자들이 구형 및 신형 구문을 혼동 — 때때로 실수로 enum class를 선언했지만, 자격 없는 열거자를 사용하여 컴파일되는 코드가 다르거나 동일한 이름으로 인해 링킹 오류가 발생했습니다.