열거형 형식(C# 프로그래밍 가이드)

업데이트: 2008년 7월

열거형 형식(enum이라고도 함)은 변수에 할당할 수 있는 명명된 정수 상수 집합을 정의하는 효율적인 방법을 제공합니다. 예를 들어, 값이 요일을 나타내는 변수를 정의한다고 가정합니다. 변수에 저장할 수 있는 의미 있는 값은 7개뿐입니다. 이러한 값을 정의하려면 enum 키워드를 사용하여 선언하는 열거형 형식을 사용할 수 있습니다.

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

기본적으로 열거형에서 각 요소의 내부 형식은 int입니다. 이전 예제와 같이 콜론을 사용하여 또 다른 정수 숫자 형식을 지정할 수 있습니다. 사용할 수 있는 모든 형식 목록은 enum (C# Reference)을 참조하십시오.

숫자 형식 대신 열거형을 사용하면 다음과 같은 장점이 있습니다.

  • 클라이언트 코드에서 변수에 유효한 값을 명확하게 지정할 수 있습니다.

  • Visual Studio의 IntelliSense에 정의된 값이 표시됩니다.

열거자 목록에 요소에 대한 값을 지정하지 않은 경우 값이 자동으로 1씩 증가합니다. 이전 예제에서 Days.Sunday의 값은 0, Days.Monday의 값은 1이 됩니다. 새 Days 개체를 만들 때 값을 명시적으로 할당하지 않으면 기본값인 Days.Sunday(0)를 갖게 됩니다. 열거형을 만들 때 가장 논리적인 기본값을 선택하고 0의 값을 지정하십시오. 그러면 열거형을 생성할 때 명시적으로 값을 할당하지 않은 경우에도 모든 열거형이 해당 기본값을 갖게 됩니다.

meetingDay 변수가 Days 형식인 경우 명시적 캐스트를 사용하지 않으면 Days로 정의된 값 중 하나만 변수에 할당할 수 있습니다. 모임 날짜가 변경된 경우에는 Days에 속하는 새 값을 meetingDay에 할당할 수 있습니다.

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
참고:

meetingDay에 임의의 정수 값을 할당할 수도 있습니다. 예를 들어, meetingDay = (Days) 42 코드 줄은 오류를 생성하지 않습니다. 하지만 암시적인 의도는 열거형 변수에 해당 열거형에 정의된 값 중 하나만 유지하는 것이므로 이렇게 하지 않는 것이 좋습니다. 열거형 형식의 변수에 임의의 값을 할당하면 오류가 발생할 위험이 커집니다.

열거형 형식의 열거자 목록에 있는 요소에 임의의 값을 할당할 수 있으며 계산된 값을 사용할 수도 있습니다.

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

비트 플래그로 사용하는 열거형 형식

열거형 형식을 사용하여 비트 플래그를 정의할 수 있습니다. 이렇게 하면 열거형 형식의 인스턴스를 사용하여 열거자 목록에 정의되어 있는 값의 조합을 저장할 수 있습니다. 물론, 이 경우에도 일부 조합은 의미가 없거나 프로그램 코드에서 허용되지 않을 수 있습니다.

System.FlagsAttribute 특성을 적용하고 AND, OR, NOT 및 XOR 비트 연산을 수행할 수 있는 적절한 값을 정의하여 비트 플래그 열거형을 만듭니다. 비트 플래그 열거형에는 "플래그가 설정되어 있지 않음"을 의미하는 0 값을 갖는 명명된 상수가 포함됩니다. "플래그가 설정되어 있지 않음"을 의미하지 않는 경우에는 플래그에 0 값을 할당하지 마십시오.

다음 예제에서 Days2라고 명명된 다른 버전의 Days 열거형을 정의합니다. Days2에는 Flags 특성이 있으며 각 열거형 요소에 다음 번 2의 거듭제곱이 값으로 할당됩니다. 이렇게 하면 값이 Days2.Tuesday 및 Days2.Thursday인 Days2 변수를 만들 수 있습니다.

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

열거형에 플래그를 설정하려면 다음 예제와 같이 논리 OR 연산자를 사용합니다.

// 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

특정 플래그가 설정되어 있는지 여부를 확인하려면 다음 예제와 같이 논리 AND 연산을 사용합니다.

// 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.

System.FlagsAttribute 특성이 있는 열거형 형식을 정의할 때 주의해야 할 사항에 대한 자세한 내용은 System.Enum을 참조하십시오.

System.Enum 메서드를 사용하여 열거형 값 검색 및 조작

모든 열거형은 System.Enum 형식의 인스턴스입니다. System.Enum에서 새 클래스를 파생시킬 수 없지만 해당 메서드를 사용하면 열거형 인스턴스에 대한 정보를 검색하고 값을 조작할 수 있습니다.

string s = Enum.GetName(typeof(Days), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
    Console.WriteLine(str);

자세한 내용은 System.Enum을 참조하십시오.

확장 메서드를 사용하여 열거형에 대한 새 메서드를 만들 수도 있습니다. 자세한 내용은 방법: 새 열거형 메서드 만들기(C# 프로그래밍 가이드)를 참조하십시오.

참고 항목

개념

C# 프로그래밍 가이드

참조

enum(C# 참조)

System.Enum

변경 기록

날짜

변경 내용

원인

2008년 7월

추가된 항목입니다.

콘텐츠 버그 수정