정수 계열의 타입(byte, sbyte, short, ushort, int, uint, long, ulong)만을 상속받아 정의할 수 있는 사용자 정의 타입이다.
숫자형 값에 문자열 식별자를 부여할 수 있으며 상속 타입을 지정하지 않을 경우 기본적으로 System.Int32이다.
[접근 제한자] enum [타입명] : [상속 타입(생략 가능)]
{
// [식별자1], ...
}
class Program
{
enum TestEnum
{
ID1 = 1,
ID2 = 3
}
static void Main(string[] args)
{
int n = (int)TestEnum.ID1; // enum -> int 명시적 형변환
Console.WriteLine((TestEnum)n); // int -> enum 명시적 형변환
n++;
Console.WriteLine((TestEnum)n); // 2에 해당하는 enum값이 정의되지 않았으므로 그대로 2 출력
n++;
TestEnum newEnum = (TestEnum)n;
Console.WriteLine(newEnum);
Console.WriteLine(newEnum - 2); // 형변환 없이 바로 enum을 int처럼 연산
}
}
// 출력:
// ID1
// 2
// ID2
// ID1
enum은 아래와 같이 flag로 사용할 수 있다.
class Program
{
public enum Days : Byte
{
Sunday = 1, // 0b00000001
Monday = 2, // 0b00000010
Tuesday = 4, // 0b00000100
Wednesday = 8, // 0b00001000
Thursday = 16, // 0b00010000
Friday = 32, // 0b00100000
Saturday = 64 // 0b01000000
}
static void Main(string[] args)
{
Days workingDays = Days.Monday | Days.Tuesday | Days.Wednesday | Days.Thursday | Days.Friday; // 0b00111110
Console.WriteLine(workingDays.HasFlag(Days.Sunday));
Console.WriteLine(workingDays.HasFlag(Days.Monday));
Console.WriteLine(workingDays);
}
}
// 출력:
// False
// True
// 62
HasFlag 메서드는 '&' 비트 연산을 수행해서 flag가 있을 경우(한개 이상의 비트가 1일 경우) True를 반환한다.
이를 활용할 경우 객체의 상태를 표현할 때(특히 상태가 중첩이 가능할 때) 유용하다.
하지만 비트 연산의 결과값인 workingDays를 그대로 출력하면 0b00111110을 10진수로 변환한 62가 출력된다.
(62에 해당하는 enum값이 정의되지 않았기 때문)
10진수가 아니라 식별자 개개인을 출력해야 flag로써의 의미가 있다.
아래와 같이 enum을 정의할 때 Flags Attribute를 지정하면 원하는 결과가 출력된다.
class Program
{
[Flags]
public enum Days : Byte
{
Sunday = 1, // 0b00000001
Monday = 2, // 0b00000010
Tuesday = 4, // 0b00000100
Wednesday = 8, // 0b00001000
Thursday = 16, // 0b00010000
Friday = 32, // 0b00100000
Saturday = 64 // 0b01000000
}
static void Main(string[] args)
{
Days workingDays = Days.Monday | Days.Tuesday | Days.Wednesday | Days.Thursday | Days.Friday; // 0b00111110
Console.WriteLine(workingDays);
string daysToString = workingDays.ToString();
Console.WriteLine(daysToString);
Console.WriteLine((Days)5); // 0b00000101
}
}
// 출력:
// Monday, Tuesday, Wednesday, Thursday, Friday
// Monday, Tuesday, Wednesday, Thursday, Friday
// Sunday, Tuesday
정수값을 enum으로 변환할 때 만약 해당 정의가 없으면 정의된 값의 합으로 표현 가능한지 판단한 후 배열의 문자열로 표기해준다.
참고 자료
시작하세요! C# 10 프로그래밍 - 정성태