-
[Enum] 가독성을 위한 약간의 수고개발/C·C++ 2021. 4. 9. 15:31
#include <iostream> using namespace std; int main() { // 중략 int color = colors[3]; }
직접 확인해보지 않는 한 colors 배열이 네 번째로 가지고 있는 요소의 색상이 무엇인지 알 수 없습니다. 어딘가에 관련 정보를 기록해놓거나 일일이 주석을 달아야 하는 번거로움이 있을 것입니다. 이런 상황에서 enum을 쓰면 좋습니다. enum은 enumeration의 약어이자 C++의 키워드입니다. enumeration의 사전적 의미는 열거입니다. enum을 열거형이라고 하는 이유입니다.
#include <iostream> using namespace std; enum Color { RED, GREEN, BLUE, BLACK, WHITE, SIZE } int main() { // 중략 auto color = colors[BLACK]; }
팀에 악의를 가진 자가 없다면 color[BLACK]은 검은색을 표현할 수 있는 정보를 가진다는 의미가 됩니다. 인덱스가 3일 때는 3이 무엇을 나타내는지 몰랐습니다. 같은 3이지만 BLACK으로 표현함으로서 의미가 생깁니다. 외부 정보를 참고하거나 주석을 달지 않아도 코드만으로 정보를 알 수 있으니 가독성이 높아집니다. enum에서 초기값을 지정하지 않으면 0부터 시작하며 초기값을 설정하면 초기값에서 1씩 증가한 숫자를 갖게 됩니다. 열거형을 이용해 다음과 같은 비트 연산도 할 수 있습니다. 배열을 만들지 않아도 데이터를 저장할 수 있습니다.
#include <iostream> using namespace std; enum TextAttribute { Bold = 1, Underline = 2, Italic = 4 }; int main() { int textAttr = 0; textAttr |= Underline; textAttr |= Italic; cout << textAttr << endl; if (textAttr & Bold) { cout << "Bold" << endl; } if (textAttr & Underline) { cout << "Underline" << endl; } if (textAttr & Italic) { cout << "Italic" << endl; } }
지금까지 사용한 enum은 unscoped enum이라고 합니다. 범위가 없다는 의미인데 열거형이 두 개 이상이면서 요소 중에 이름이 같은 것이 있다고 하면 문제가 될 수 있습니다. 비주얼 스튜디오, gcc 모두에서 컴파일 오류가 납니다. 범위 연산자를 써도 컴파일 오류는 사라지지 않습니다.
#include <iostream> using namespace std; enum TextAttribute { Bold = 1, Underline = 2, Italic = 4 }; enum ColorAttribute { Underline = 1, }; int main() { int textAttr = 0; textAttr |= TextAttribute::Underline; textAttr |= Italic; }
C++11부터 enum class(or enum struct)가 생겼습니다. scoped enum입니다. 위의 예제에서 TextAttribute를 enum class로 바꿔보면 main함수에서 바로 빨간줄이 보일 겁니다. 다음과 같이 수정해야 합니다. 반드시 범위를 지정해야 하며, 캐스팅을 해줘야 합니다. C/C++가 기본적으로 강타입 경향의 언어인데 타입 지정을 더욱 엄격하게 강제합니다. scoped enum에서는 모호한 일이 발생할 소지가 없습니다.
#include <iostream> using namespace std; enum class TextAttribute { Bold = 1, Underline = 2, Italic = 4 }; enum ColorAttribute { Underline = 1, }; int main() { int textAttr = 0; textAttr |= (int)TextAttribute::Underline; textAttr |= (int)TextAttribute::Italic; }
마지막으로 다음과 같이 사용할 수도 있습니다.
#include <iostream> using namespace std; enum class TextAttribute { Bold = 1, Underline = 2, Italic = 4 }; int main() { TextAttribute textAttr{ TextAttribute::Bold }; cout << (int)textAttr << endl; }
'개발 > C·C++' 카테고리의 다른 글
[Dangling Pointer] 유효하지 않은 포인터 (0) 2021.04.10 [Pointer] 달과 손가락 (0) 2021.04.10 [Cache] 시간 지역성, 공간 지역성 (0) 2021.04.08 'if' you wanna 'switch' something (0) 2021.04.06 음수 표현(feat.2의 보수) (0) 2021.04.03