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)으로 표시되어 디버깅과 로깅에도 큰 도움이 됩니다.