[Flags]는 특별한 목적을 위해 사용되는 특성(attribute)이다. 주로 enum 형식을 비트 연산을 위한 플래그 집합으로 사용할 때 붙인다. 이를 통해 여러 가지 상태를 한 변수에 저장하고, 비트 단위의 연산을 수행할 수 있다.

< [Flags]의 정의와 사용 시기 >

[Flags] 속성은 enum(열거형)에 대해 선언되며, 각각의 값이 비트 수준에서 조합될 수 있음을 나타낸다. 이는 주로 '플래그(flag)' 역할을 하는 enum을 정의할 때 사용된다. 이렇게 선언된 enum 값은 비트 OR 연산자(|)를 이용해 합쳐지거나, 비트 AND 연산자(&)를 통해 특정 플래그가 활성화되었는지 확인할 수 있다.

[Flags]
public enum MyFlags
{
    None = 0,   // 0000
    Flag1 = 1,  // 0001
    Flag2 = 2,  // 0010
    Flag3 = 4,  // 0100
    Flag4 = 8   // 1000
}

 

각 플래그는 2의 거듭제곱을 사용하므로, 각 플래그가 고유한 비트를 차지한다. 이렇게 설정함으로써 각 플래그를 조합하여 사용할 수 있다.
[[Flags]의 사용 예]

MyFlags activeFlags = MyFlags.Flag1 | MyFlags.Flag3;

// Flag1 and Flag3 are active
Console.WriteLine(activeFlags.HasFlag(MyFlags.Flag1)); // prints True
Console.WriteLine(activeFlags.HasFlag(MyFlags.Flag3)); // prints True

// Flag2 and Flag4 are not active
Console.WriteLine(activeFlags.HasFlag(MyFlags.Flag2)); // prints False
Console.WriteLine(activeFlags.HasFlag(MyFlags.Flag4)); // prints False

 

위 코드에서는 MyFlags.Flag1와 MyFlags.Flag3를 OR 연산을 통해 activeFlags에 저장한다. 이후 HasFlag 메소드를 통해 각 플래그가 활성화되었는지를 확인할 수 있다.

< [Flags] 사용 시 주의사항 >

[Flags]를 사용할 때는 두 가지 주요한 주의사항이 있다.
플래그의 값이 2의 거듭제곱이어야 한다. 이렇게 설정해야 각 플래그가 고유한 비트를 차지할 수 있다.
None 값은 항상 0을 사용해야 한다. 이는 아무런 플래그도 설정되지 않았음을 나타내는 값으로, 해당 플래그를 모두 클리어하는데 사용된다.

+ Recent posts