C#에서 enum은 여러 개의 값을 한 번에 표현할 수 있는 유용한 기능입니다. 하지만, enum을 flag로 사용하려면 몇 가지 제약이 있습니다.
- enum의 값은 정수여야 합니다.
- enum의 값은 0부터 시작해야 합니다.
이러한 제약을 해결하기 위해 C#에는 [Flags] 애트리뷰트가 제공됩니다. [Flags] 애트리뷰트를 사용하여 enum을 flag로 사용할 수 있도록 설정할 수 있습니다.
애트리뷰트 설정하기
애트리뷰트를 설정하려면 enum에 다음과 같은 [Flags] 애트리뷰트를 추가하면 됩니다.
[Flags]
enum MyFlags
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
}
이렇게 하면 MyFlags enum은 0부터 시작하는 정수 값을 갖게 됩니다. 또한, Flag1, Flag2, Flag3는 각각 1, 2, 4의 값을 갖게 됩니다.
특정 플래그가 활성화되어 있는지 확인하기
[Flags] 애트리뷰트를 설정한 enum을 사용하여 특정 플래그가 활성화되어 있는지 확인하려면 HasFlag() 메서드를 사용할 수 있습니다.
MyFlags flags = MyFlags.Flag1 | MyFlags.Flag2;
// Flag1이 활성화되어 있는지 확인
bool isFlag1Enabled = flags.HasFlag(MyFlags.Flag1);
// 결과: true
이 코드는 flags 변수가 MyFlags.Flag1과 MyFlags.Flag2를 포함하고 있습니다. HasFlag() 메서드는 flags 변수에 MyFlags.Flag1이 포함되어 있는지 확인합니다. 결과는 true입니다.
비트연산이란?
비트연산은 정수형 데이터의 비트를 조작하는 연산입니다. 비트는 0과 1로 이루어진 이진수의 최소 단위입니다. 비트연산은 정수형 데이터의 비트를 직접 조작하기 때문에, 정수형 데이터를 효율적으로 처리할 수 있는 방법을 제공합니다.
비트연산의 종류
비트연산은 다음과 같은 종류로 나뉩니다.
- AND : 두 정수의 비트가 모두 1인 경우에만 1을 반환합니다.
- OR : 두 정수의 비트 중 하나 이상이 1인 경우에만 1을 반환합니다.
- XOR : 두 정수의 비트가 서로 다른 경우에만 1을 반환합니다.
- NOT : 정수의 모든 비트를 반전시킵니다.
- << : 정수의 비트를 왼쪽으로 이동합니다.
- >> : 정수의 비트를 오른쪽으로 이동합니다.
비트연산의 예
int a = 1; // 00000001
int b = 2; // 00000010
// AND 연산
int and = a & b; // 00000000
// OR 연산
int or = a | b; // 00000011
// XOR 연산
int xor = a ^ b; // 00000011
// NOT 연산
int not = ~a; // 11111110
// << 연산
int shiftLeft = a << 1; // 00000010
// >> 연산
int shiftRight = a >> 1; // 00000000
특정 Flag를 추가하기
현재 Flag에 특정 Flag를 추가하고 싶다면, 비트연산의 OR 연산자를 활용하면 됩니다.
[Flags]
enum MyFlags
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
}
// 현재 enum 값
MyFlags currentFlags = MyFlags.Flag1 | MyFlags.Flag2;
// 추가할 flag
MyFlags addFlag = MyFlags.Flag3;
// 새로운 enum 값
MyFlags newFlags = (MyFlags)(currentFlags | addFlag);
위의 코드에서는 currentFlags에 현재의 플래그 값을 할당합니다. 여기서는 MyFlags.Flag1과 MyFlags.Flag2를 포함하도록 설정하였습니다.
다음으로 addFlag에 추가할 플래그를 할당합니다. 이 코드에서는 MyFlags.Flag3을 추가하고자 합니다.
마지막으로 newFlags에는 currentFlags에 addFlag를 추가한 값을 할당합니다. 이를 위해 비트 연산을 사용합니다. currentFlags | addFlag는 currentFlags와 addFlag의 비트 OR 연산을 수행한 결과를 나타냅니다. 이렇게 함으로써 addFlag에 해당하는 비트를 추가할 수 있습니다.
특정 Flag를 제거하기
[Flags]
enum MyFlags
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
}
// 현재 enum 값
MyFlags currentFlags = MyFlags.Flag1 | MyFlags.Flag2;
// 제거할 flag
MyFlags removeFlag = MyFlags.Flag1;
// 새로운 enum 값
MyFlags newFlags = (MyFlags)(currentFlags & ~removeFlag);
위의 코드에서는 currentFlags에 현재의 플래그 값을 할당합니다. 여기서는 MyFlags.Flag1과 MyFlags.Flag2를 포함하도록 설정하였습니다.
다음으로 removeFlag에 제거할 플래그를 할당합니다. 이 코드에서는 MyFlags.Flag1을 제거하고자 합니다.
마지막으로 newFlags에는 currentFlags에서 removeFlag를 제거한 값을 할당합니다. 이를 위해 비트 연산을 사용합니다. ~removeFlag는 removeFlag의 비트를 반전시킨 값을 나타냅니다. currentFlags & ~removeFlag는 currentFlags와 removeFlag의 비트 AND 연산을 수행한 결과를 나타냅니다. 이렇게 함으로써 removeFlag에 해당하는 비트를 제거할 수 있습니다.
요약
C#에서 enum을 flag로 사용하려면 다음과 같은 방법을 사용할 수 있습니다.
- [Flags] 애트리뷰트를 설정합니다.
- HasFlag() 메서드를 사용하여 특정 플래그가 활성화되어 있는지 확인합니다.
- 비트 연산을 사용하여 현재 flag에 특정 flag를 추가하거나 빼냅니다.
'C#' 카테고리의 다른 글
List<T> FindIndex (0) | 2024.03.08 |
---|---|
객체 생성 : Activator.CreateInstance와 new(T) (0) | 2023.12.16 |
C#에서 class와 struct의 차이점 (0) | 2023.12.06 |
C# Linked List (0) | 2023.12.02 |
C# 11.0의 required modifier (0) | 2023.11.10 |