ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Enum] 가독성을 위한 약간의 수고
    개발/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++' 카테고리의 다른 글

    [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

    댓글

Designed by Tistory.