본문 바로가기
Study

C#, Enum 'Flags' Technic

by Client. DJ 2022. 2. 28.
반응형

Flags Attribute

'Flags' 어트리뷰트

Enum 타입을 이진수로 구성하여 사용할 수 있도록 해줍니다. 이는 하나의 Enum 변수가 여러개의 값을 가질 수 있도록 가능하게 해줍니다.

예제

using System;

public class Example
{
    [Flags]
    private enum eCheck : byte
    {
        None        = 0,
        Apple       = 1 << 0,   // 2의 0승
        Banana      = 1 << 1,   // 2의 1승
        Pineapple   = 1 << 2,   // 2의 2승
        All         = byte.MaxValue,
    }

    private eCheck check = eCheck.None;

    public void Main()
    {
        // 추가
        check |= eCheck.Apple;
        check |= eCheck.Banana;
        check |= eCheck.Pineapple;
        Console.WriteLine(check);   // = Apple | Banana | Pineapple;

        // Apple 있는지 체크
        bool isExist = (check & eCheck.Apple) != 0;
        Console.WriteLine($"Apple Exist Resut: {isExist}");

        // 제거
        check &= ~eCheck.Apple;
        check &= ~eCheck.Banana;
        check &= ~eCheck.Pineapple;
        Console.WriteLine(check);   // = None;

        // Apple 있는지 체크
        isExist = (check & eCheck.Apple) != 0;
        Console.WriteLine($"Apple Exist Resut: {isExist}");

        // Results :
        // Apple, Banana, Pineapple
        // Apple Exist Resut: True
        // None
        // Apple Exist Resut: False
    }
}

위의 코드에서 보시다시피 Enum을 '[Flags]' 어트리뷰트로 선언하고, 각각의 값에 대해서 시프트 연산으로 값으로 표현해줍니다. 그리고 이후 변수를 선언 후 이진연산을 통해서 값을 추가해줄 수 있습니다.

이미지

111로 모든 값이 포함되었다.

이미지 예시를 보면 이진 연산으로 실제로 이진값으로 111로 들어갔습니다. 이는 'Apple | Banana | Pineapple'을 의미합니다. 다른 예시로 101이라면 'Apple | Pineapple'이 되는 것이 되겠습니다.

사용의 이유와 목적

먼저 여러 개발자 입장에서 직관적으로 표현됩니다. boolean의 경우 하나의 상태만을 보여줄 수 있는데, 하나의 값으로 여러 상태를 표현하고 싶은 경우 사용 목적에 해당됩니다..

마무리

여러가지의 값을 한번에 넘겨주고 싶을 때, 또는 여러개의 옵션 값을 넘겨주고 싶은 경우 사용하면 편리하게 사용할 수 있습니다. 시프트 연산으로 표현이 가능하면서 동시에 가독성이 좋아 데이터를 효율적이게 사용할 수 있습니다.

반응형

댓글