posted by REDFORCE 2017. 3. 22. 17:55

목차


1. Auto

2. range based for

3. enum class

4. non-static data member initializers

5. initializer lists

6. default / delete definition

7. override / final

8. emplacement

9. constexpr

10. lambda

11. random

12. thread


이번 글에서는 [3편] enum Class 에 대해서 적어보도록 하겠습니다.


enum Class에 앞서 먼저 enum이 뭔지 알아야하니 같이 나열해보며 비교하도록 하겠습니다.


3. enum class


enum 

  • c++11의 enum은 C++03 표준과 다르게 두 종류의 enum으로 바뀌었다.
  • 강한 형 사용과 범위를 가진다.
  • 'unscoped enumeration'과 'scoped enumeration'
  • unscoped enumeration은 기존(C++03) enum과 비슷

 


위 코드를 보면 스콮이 있는 enum과 없는 enum으로 구분되어 있습니다.


scoped enumeration은 ITEMTYPE:: 이라는 네임스페이스가 따라 붙는 것을 볼 수 있습니다.

(아...영타 치기 뭔가 귀찮네요...= _=)


기존의 enum은 위에 적혀있는 ITEMTYPE:: 스페이스가 없는 enum입니다.



이게 왜 좋은거냐?


라고 이제 생각할 때가 됐는데요.



우리가 보통 enum을 헤더에 선언하여 사용하다보면 대체 이 enumeration값들이 어디에 있는 거여? 하고 햇갈리게 됩니다.


따라서 scoped enumeration 같은 경우 네임스페이스가 따라 붙기 때문에


아 거기서 썼던 enum이구만~ 하고 바로 알 수 있습니다.




그리고 위와 같이 enum class로 선언하면 네임스페이스를 붙이지 않을 경우 error를 띄우게 됩니다.


강제적으로 강한 형 사용을 강요하게 되조.


덕분에 enumeration 값이 어디에 있던 것인지 강제적으로 명시하는 코드를 작성하게 됩니다.


어떻게 보면 귀찮다~ 라고 볼 수도 있지만


향후 다시 이 코드를 봤을 때 도움이 많이 되고 유지보수에도 많은 기여를 할 거라 예상 됩니다.



그래서~ 필요하다면 쓸 수 있게 끔 타입 케스팅 자체도 지원을 하고 있습니다.




enum class 자체에 대해서는 그닥 알게 없을 수도 있으나 이런식으로 C++ enum을 쓸 수 있다를 알고 가시면 좋을 것 같습니다.


(enum Class를 활용한 뒤부터는 모든 enum을 죄다 이걸로 싸그리 바꿔버리고 있는...)



다음 글 non-static data member initializers 에서 뵐게요!