C#

C# Flag 속성 사용 | Enum Flag | FlagsAttribute

DragonTory 2022. 9. 21. 16:43
반응형

C# Flag 속성 사용 | Enum Flag | FlagsAttribute

 

C C++ 시절에 많이 사용 하던 옵션 Flag를 Bit연산으로 설정 하거나 검색 할 때 많이 사용 했었는데 

C#에서는 더 편하게 이 기능을 사용 할 수 있습니다.

 

enum을 선언 할 때 [Flags] 속성을 사용 하면 됩니다. 

[Flags]
enum Color
{
    None = 0,
    Black = 1,
    Red = 2,
    Green = 4,
    Blue = 8,

    All = int.MaxValue
};

위와 같이 enum을 선언 하면 이 enum은 비트 플래그로 처리 됩니다. 

enum 형은 내부적으로 기본 int 형으로 4 바이트 크기로 사용 되는데 

데이터 사이즈를 줄이기 위해  byte, short등으로도 변경 할 수 있습니다. 

[Flags]
enum Color : short
{
    None = 0,
    Black = 1,
    Red = 2,
    Green = 4,
    Blue = 8,

    All = short.MaxValue
};

이렇게 : short 와 같이 데이터 타입을 추가 해 주면 됩니다. 

 

enum의 각각의 리스트는 위와 같이 2의 배수로 설정 해야 하는데

이게 많아지면 계산 해서 적기 불편 합니다. 

 

다음과 같이 1비트를 쉬프트 연산과 자릿수로 표기 하면 여러모로 편하게 사용 할 수 있습니다. 

[Flags]
enum Color
{
    None = 0,

    Black  = 1 << 0,
    Red    = 1 << 1,
    Green = 1 << 2,
    Blue   = 1 << 3,

    All = int.MaxValue
};

사용법은 

Color color = Color.Black | Color.Green | Color.Blue;

와 같이 여러 옵션을 적용 할 수 있고 

if ( (color & Color.Green ) != 0 ) 
{
    // green이 적용 되었습니다. 
}

// 혹은

if ((color & Color.Green) == Color.Green)
{
    // green이 적용 되었습니다. 
}
string result = (color & Color.Green ) == Color.Green ? "true" : "false";

와 같이 특정 비트가 설정 되었는지 확인 할 수 있습니다.

 

또한 특정 플래그를 변수에 추가 하고 싶으면 

color |= Color.Red;

와 같이 하면 됩니다.  ( color = color | Color.Red; 와 같음.)

 

특정 플래그를 변수에서 삭제 하기 

color &= ~Color.Red;

특정 비트를 반전 시켜 변수에 앤드 연산 시켜 주면 됩니다. 

 

모든 플래그 초기화 :  color = Color.None

모든 플래그 설정:  color = Color.All

 

 

 

 

반응형