본문 바로가기
NOTE/Programming

[C#] 열거형 형식

by DevAthena 2016. 11. 8.

출처 : MSDN, 기타 블로그


enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };

위와 같은 일반 열거형인 enum을

아래와 같은 형식으로 바꿔주게 되면,

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40,
    All = int.MaxValue
}

아래와 같이 AND, OR, NOT 및 XOR 비트 연산을 수행하여 합치거나 비교하는 등의 유용한 사용을 꾀할 수 있습니다.

// Initialize with two flags using bitwise OR.

meetingDays = Days2.Tuesday | Days2.Thursday;

// Set an additional flag using bitwise OR.

meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);

// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.

meetingDays = meetingDays ^ Days2.Tuesday;

Console.WriteLine("Meeting days are {0}", meetingDays);

// Output: Meeting days are Thursday, Friday

// Test value of flags using bitwise AND. 특정 플래그가 설정되어 있는지의 여부를 확인하려는 연산

bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;

Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");

// Output: Thursday is a meeting day.


더 간단히 요약하자면

- 두 속성을 하나의 변수에 담는 것 : meetingDays = Days2.Tuesday | Days2.Thursday;

- 값이 존재하는지 확인 : bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;

- 특정 값을 추가 : meetingDays = meetingDays | Days2.Friday;

- 특정 값을 제거 : meetingDays = meetingDays ^ Days2.Tuesday;

- 특정 값을 반전 (1->0, 0->1) : meetingDays &= ~Days2.Thursday;

- 모든 값 삭제 : meetingDays = Days2.None;

- 모든 값 설정 : meetingDays = Days2.All;

- 특정 값을 제외하고 모두 설정 : meetingDays = Days2.All ^ Days2.Sunday ^ Days2.Monday;



20121220추가 (펌)

[Flags]
public enum PriceType
{
    None = 0,
    Gold = 1 << 0,
    Cash = 1 << 1,
    Heart = 1 << 2,
    Free = 1 << 3,
    All = int.MaxValue // int의 Max값을 넣으면 모든 비트가 1이므로 무조건 All이 된다
}
 
// [Flags] Attribute를 위에 붙여주면 비트연산처럼 사용가능
PriceType e_PriceType = PriceType.Gold | PriceType.Cash;
 
// Flag 값 확인
if((e_PriceType & PriceType.Gold) != 0)
{
    // Gold Flag값이 들어있으면
}
 
// Gold Flag 설정
e_PriceType |= PriceType.Gold;
 
// Gold Flag 제거
e_PriceType &= ~PriceType.Gold;
 
// Gold Flag 반전 (있으면 제거하고 없으면 설정)
e_PriceType ^= PriceType.Gold;
 
// Flag 모두 제거
e_PriceType = PriceType.None;
 
// Flag 모두 설정
e_PriceType = PriceType.All;
 
// Gold와 Free를 제외하고 모두 설정
e_PriceType = PriceType.All ^ PriceType.Gold ^ PriceType.Free;


'NOTE > Programming' 카테고리의 다른 글

[C#] Dictionary<Tkey, TValue> 클래스  (0) 2018.04.01
[C++] 문자열을 입력받는 12가지 방법 (펌)  (0) 2018.04.01
[C#] Singleton  (0) 2016.10.05
[C#] Func & Action 델리게이트 (펌)  (0) 2016.09.29
[C#] 람다식 (펌)  (0) 2016.09.29