티스토리 뷰
C++/Effective Modern C++
[Effective Modern C++] 항목 10. 범위 없는 enum보다 범위 있는 enum을 선호하라
pppgod 2019. 9. 28. 21:05enum과 enum class가 있다. 둘의 차이는 범위가 있냐 없냐의 차이가 있다. 어떤 차이가 있는지 알아보자.
Scope 문제
일반적으로 중괄호 쌍이 정의하는 범위로 가시성이 정해지는데, enum의 경우에는 그렇지 않다. 예시를 보자.
enum Color { black, white, red };
auto white = false; // 오류 white가 이미 선언되어 있음
white의 스코프 문제로 똑같은 white를 선언할 수가 없다. 하지만 범위 있는 enum은 그렇지 않다.
enum class Color { black, white, red };
auto white = false;
Color c = white; // 오류 범위 안에 white라는 이름의 열거자가 없음
Color c = Color:white;
위의 코드보다 명확히 무엇을 지칭하는지 알기 쉬워졌다.
묵시적 변환 문제
enum의 경우에는 묵시적으로 타입이 변환된다. 그래서 아래와 같은 코드를 컴파일러에서 잡지 못한다.
enum Color { black, white, red};
std::vector<std::size_t> primeFactors(std::size_t x);
Color c = red;
if(c < 14.5) {
auto factors = primeFactors(c);
}
c가 정수형식으로 변환되기 때문에 float형으로도 변환이 가능해진다. 그러나 enum class의 경우에는 컴파일러가 먼저 에러를 찾는다. 그런데 만약 타입을 변환하고 싶다면 캐스팅을 사용해 타입을 변경하면 되므로 enum을 쓸 이유는 없다.
참고 서적
스콧 마이어스, Effective Modern C++
'C++ > Effective Modern C++' 카테고리의 다른 글
[Effective Modern C++] 항목 12. 재정의 함수들을 override로 선언하라 (0) | 2019.10.07 |
---|---|
[Effective Modern C++] 항목 11. 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라 (0) | 2019.10.07 |
[Effective Modern C++] 항목 9. typedef보다 별칭 선언을 선호하라 (0) | 2019.09.28 |
[Effective Modern C++] 항목 7. 객체 생성 시 괄호(())와 중괄호({})를 구분하라 (0) | 2019.09.21 |
[Effective Modern C++] 항목 6. auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라 (0) | 2019.09.08 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C
- std::forward
- 다이소
- Unreal
- detach
- const
- auto
- MOVE
- 보편참조
- 포인터
- C++
- std::move
- thread
- forward
- 발아시기
- CPP
- C++11
- Effective
- Future
- async
- Overloading
- Perfect
- Modern
- Override
- Forwarding
- Join
- 보편 참조
- 람다
- Effective Modern C++
- C++14
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함