Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#의 [Flags] Enum 특성 완벽 가이드: 하나의 변수로 여러 값 다루기

C#에서 [Flags] 특성은 열거형(Enum) 변수가 하나의 값만 갖는 대신, 여러 개의 값을 동시에 가질 수 있도록 해주는 강력한 기능입니다. 열거형이 단일 값을 나타내는 것이 아니라 플래그(flag)들의 집합을 나타낼 때 사용하는 것이 좋습니다.

[Flags] 특성을 사용해야 하는 경우

[Flags] 특성은 모든 열거형에 무조건 붙이는 것이 아니라, 다음 조건에 해당할 때 사용하는 것이 바람직합니다.

  • 숫자 값에 대해 비트 연산(AND, OR, XOR)을 수행해야 하는 경우
  • 하나의 변수에 여러 상태를 조합하여 저장해야 하는 경우

열거형 상수 정의 규칙

플래그 열거형을 정의할 때는 각 상수를 2의 거듭제곱(1, 2, 4, 8, 16...)으로 지정해야 합니다. 이렇게 하면 결합된 열거형 상수 내에서 개별 플래그들이 서로 겹치지 않아, 비트 연산으로 각 플래그를 정확하게 구분할 수 있습니다.

예제 코드

다음 예제는 소셜 미디어 서비스 플래그를 정의하고, 비트 OR 연산으로 여러 서비스를 하나의 변수에 조합한 뒤, 비트 AND 연산으로 특정 서비스 포함 여부를 확인합니다.

class Program {
    [Flags]
    enum SocialMediaFlags { None = 0, Facebook = 1, Twitter = 2, LinkedIn = 4, Instagram = 8, Snapchat = 16, Pinterest = 32, Reddit = 64 }
    
    static void Main() {
        var SocialMedia1 = SocialMediaFlags.Facebook | SocialMediaFlags.Twitter | SocialMediaFlags.Instagram;
        var SocialMedia2 = SocialMediaFlags.LinkedIn;
        var SocialMedia3 = SocialMediaFlags.Pinterest | SocialMediaFlags.Reddit;
        
        SocialMediaFlags[] SocialMediasFlags = { SocialMedia1, SocialMedia2, SocialMedia3 };
        
        for (int ctr = 0; ctr < SocialMediasFlags.Length; ctr++) {
            if ((SocialMediasFlags[ctr] & SocialMediaFlags.Facebook) == SocialMediaFlags.Facebook) {
                Console.WriteLine("SocialMedia {0} has Facebook service: {1}", ctr + 1, "Yes");
            }
        }
        
        Console.WriteLine();
    }
}

실행 결과

SocialMedia 1 has Facebook service: Yes

추가 팁: HasFlag 메서드 활용

.NET 4.0 이상에서는 위와 같은 비트 AND 연산 대신 Enum.HasFlag() 메서드를 사용해 더욱 간결하게 플래그 포함 여부를 확인할 수 있습니다.

if (SocialMediasFlags[ctr].HasFlag(SocialMediaFlags.Facebook)) {
    Console.WriteLine("Facebook 서비스가 포함되어 있습니다.");
}

또한 [Flags] 특성이 적용된 열거형 변수를 출력하면, 조합된 값이 쉼표로 구분된 이름 목록(예: Facebook, Twitter, Instagram)으로 표시되어 디버깅과 로깅에도 큰 도움이 됩니다.