본문 바로가기
C#/C# 학습 (TIL)

Enum flag

by jjiing 2023. 2. 6.

열거형

  • 기본 정수 숫자 형식의 명명된 상수 집합에 의해 정의되는 값 형식
  • Enum 으로 정의
  • 상호 배타적인 값의 집합에서의 선택 또는 선택의 조합을 나타낼 수 있다. 선택의 조합을 나타내려면 열거형 형식을 비트 플래그로 정의한다.

예시

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

 

비트 플래그로서 열거형 형식

  • 열거형 형식으로 선택의 조합을 나타내려면 개별 선택이 비트 필드가 되도록 열거형 멤버를 정의한다. 즉, 이러한 멤버의 연결된 값은 제곱이어야 한다. 그리고 비트논리연산차(|, &)를 사용하여 각각 선택을 조합하거나 선택의 조합을 교차할 수 있다.
  • 열거형 형식이 비트 필드를 선언한다고 표시하려면 Flags 특성을 적용한다.
  • 열거형 멤버의 비트 연산은 선언된 값의 합이 다른 멤버의 값과 절대로 겹치지 않는다는 것을 전제로 한다.
[Flags]
public enum EDays
{
    None      = 0b_0000_0000,  // 0
    Monday    = 0b_0000_0001,  // 1
    Tuesday   = 0b_0000_0010,  // 2
    Wednesday = 0b_0000_0100,  // 4
    Thursday  = 0b_0000_1000,  // 8
    Friday    = 0b_0001_0000,  // 16
    Saturday  = 0b_0010_0000,  // 32
    Sunday    = 0b_0100_0000,  // 64
    Weekend   = Saturday | Sunday
}

아래 weekend 처럼 saturday 와 sunday 를 조합해서 사용할 수 있다.

그렇게 되면 겹치는 멤버가 없게 항상 고유한 조합이 완성된다.

  • 비트로 선언하기
[Flags]
public enum EDays
{
		None      = 0,
		Monday    = 1 << 0,
		Tuesday   = 1 << 1,
		Wednesday = 1 << 2,
		Thursday  = 1 << 3,
		Friday    = 1 << 4,
		Saturady  = 1 << 5,
		Sunday    = 1 << 6,
		Weekend   = Saturday | Sunday,
}
  • 조건 정의하기

예를들어 금요일을 제외했을 때 특정 코드를 실행시키려 한다면,

아래와 같이 나타낼 수 있다.

EDay type;

if( (type & EDay.Friday) == 0 )
		//~~코드~~

비교해보려고 하는 type과 Friday를 ‘비트연산 &’를 시켰을 때 type의 조합에 Friday가 포함돼있지 않다면 결과가 0 이 나오므로 위와 같이 작성할 수 있다.

 

 

실제 내가 적용한 경우는 서버와 통신할 때 특정 프로토콜 타입에서의 통신 규칙을 정의하고 싶어서

프로토콜 타입으로 이넘 플래그를 정의하여 특정 프로토콜 타입이 아니라면 어떤 화면을 띄워준다~ 와 같이 적용했다.

이를 이넘 플래그로 정의한 이유는 프로토콜 타입이 다양하게 존재하기에, 이를 활용해 상황에 따라 여러 조합의 이넘 값을 만들 수가 있기 때문이다.