enum(C# 참조)
enum 키워드를 사용하여 열거자 목록이라고 하는 명명된 상수 집합으로 구성된 고유 형식인 열거형을 선언합니다.
대개 네임스페이스의 모든 클래스가 같은 수준으로 열거형에 액세스할 수 있도록 네임스페이스 내에서 직접 열거형을 정의하는 것이 좋습니다.하지만 특정 클래스나 구조체 내에 열거형이 중첩될 수도 있습니다.
기본적으로 첫 번째 열거자 값은 0이며 그 이후의 열거자 값은 순서대로 1씩 증가됩니다.예를 들어, 다음 열거에서 Sat은 0이고 Sun은 1, Mon은 2 등입니다.
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
다음 예제와 같이 열거자는 이니셜라이저를 사용하여 기본값을 재정의할 수 있습니다.
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
이 열거형에서 요소의 순서는 0 대신 1부터 시작합니다.그러나, 0의 값을 갖는 상수를 포함하는 것이 좋습니다.자세한 내용은 열거형 형식(C# 프로그래밍 가이드)를 참조하십시오.
모든 열거형에는 char 형식을 제외한 임의의 정수 계열 형식이 될 수 있는 내부 형식이 있습니다.열거형 요소의 기본적인 내부 형식은 int입니다.바이트와 같은 다른 정수 형식의 열거형을 선언하려면 다음 예제에서와 같이 콜론을 사용하여 identifier 다음에 형식을 사용합니다.
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
열거형으로 승인된 형식은 byte, sbyte, short, ushort, int, uint, long 또는 ulong입니다.
Days 형식의 변수에는 명명된 상수뿐 아니라 내부 형식의 범위에 있는 모든 값을 할당할 수 있습니다.
enum E의 기본값은 식 (E)0으로 계산된 값입니다.
[!참고]
열거자의 이름에는 공백이 포함될 수 없습니다.
내부 형식은 각 열거자에 할당될 저장소 크기를 지정합니다.그러나 enum 형식에서 정수 계열 형식으로 변환하려면 명시적 캐스트가 필요합니다.예를 들어, 다음 문은 enum을 int로 변환하는 캐스트를 사용하여 열거자 Sun을 int 형식 변수에 대입합니다.
int x = (int)Days.Sun;
일부 요소가 비트 OR 연산으로 결합될 수 있는 열거형에 System.FlagsAttribute를 적용하면 일부 도구에서 이 열거형을 사용할 때 해당 특성이 enum의 동작에 영향을 줍니다.Console 클래스 메서드 및 계산기 등의 도구를 사용할 때 이러한 변경 사항을 확인할 수 있습니다.세 번째 예제를 참조하십시오.
강력한 프로그래밍
다른 상수와 마찬가지로, 컴파일 타임에 열거형의 개별 값에 대한 모든 참조는 숫자 리터럴로 변환됩니다.따라서 상수(C# 프로그래밍 가이드)에서 설명하는 버전 문제가 발생할 가능성이 있습니다.
새 버전의 열거형에 값을 추가로 할당하거나 새 버전의 열거형 멤버 값을 변경하면 종속된 소스 코드에 문제가 발생할 수 있습니다.switch 문에서 열거형 값이 사용되는 경우가 많습니다.enum 형식에 요소가 추가되었으면 switch 문의 기본 섹션을 예기치 않게 선택할 수 있습니다.
다른 개발자가 사용자의 코드를 사용할 경우 enum 형식에 새 요소가 추가된다면 해당 코드에서 이를 적절히 처리할 수 있도록 지침을 제공해야 합니다.
예제
다음 예제에서는 열거형 Days를 선언합니다.두 개의 열거자를 명시적으로 정수로 변환하여 정수 변수에 대입합니다.
public class EnumTest
{
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
static void Main()
{
int x = (int)Days.Sun;
int y = (int)Days.Fri;
Console.WriteLine("Sun = {0}", x);
Console.WriteLine("Fri = {0}", y);
}
}
/* Output:
Sun = 0
Fri = 5
*/
다음 예제에서는 base-type 옵션을 사용하여 멤버가 long 형식인 enum을 선언합니다.열거형의 내부 형식이 long인 경우에도 캐스트를 사용하여 열거형 멤버를 long 형식으로 명시적으로 변환해야 합니다.
public class EnumTest2
{
enum Range : long { Max = 2147483648L, Min = 255L };
static void Main()
{
long x = (long)Range.Max;
long y = (long)Range.Min;
Console.WriteLine("Max = {0}", x);
Console.WriteLine("Min = {0}", y);
}
}
/* Output:
Max = 2147483648
Min = 255
*/
다음 코드 예제에서는 enum 선언에 System.FlagsAttribute 특성을 사용하는 방법과 그 결과를 보여 줍니다.
// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
// The flag for SunRoof is 0001.
SunRoof = 0x01,
// The flag for Spoiler is 0010.
Spoiler = 0x02,
// The flag for FogLights is 0100.
FogLights = 0x04,
// The flag for TintedWindows is 1000.
TintedWindows = 0x08,
}
class FlagTest
{
static void Main()
{
// The bitwise OR of 0001 and 0100 is 0101.
CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;
// Because the Flags attribute is specified, Console.WriteLine displays
// the name of each enum element that corresponds to a flag that has
// the value 1 in variable options.
Console.WriteLine(options);
// The integer value of 0101 is 5.
Console.WriteLine((int)options);
}
}
/* Output:
SunRoof, FogLights
5
*/
설명
Flags를 제거하면 예에 다음 값이 표시됩니다.
5
5
C# 언어 사양
자세한 내용은 C# 언어 사양을 참조하십시오. 이 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.