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

열거형 형식(열거형이라고도 함)은 변수에 할당할 수 있는 명명된 정수 계열 상수 집합을 정의하는 효율적인 방법을 제공합니다.An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable. 예를 들어 값이 요일을 나타내는 변수를 정의해야 한다고 가정합니다.For example, assume that you have to define a variable whose value will represent a day of the week. 해당 변수에 저장할 수 있는 의미 있는 값이 7개만 있습니다.There are only seven meaningful values which that variable will ever store. 이러한 값을 정의하려면 enum 키워드를 사용하여 선언되는 열거형 형식을 사용할 수 있습니다.To define those values, you can use an enumeration type, which is declared by using the enum keyword.

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

기본적으로 열거형에서 각 요소의 기본 형식은 int입니다. 이전 예제와 같이 콜론을 사용하여 다른 정수 계열 숫자 형식을 지정할 수 있습니다.By default the underlying type of each element in the enum is int. You can specify another integral numeric type by using a colon, as shown in the previous example. 가능한 형식의 전체 목록은 enum(C# 참조)을 참조하세요.For a full list of possible types, see enum (C# Reference).

다음 예제와 같이 기본 형식으로 캐스트하여 기본 숫자 값을 확인할 수 있습니다.You can verify the underlying numeric values by casting to the underlying type, as the following example shows.

Day today = Day.Monday;
int dayNumber =(int)today;
Console.WriteLine("{0} is day number #{1}.", today, dayNumber);

Month thisMonth = Month.Dec;
byte monthNumber = (byte)thisMonth;
Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);

// Output:
// Monday is day number #1.
// Dec is month number #11.

다음은 숫자 형식 대신 열거형을 사용할 경우의 장점입니다.The following are advantages of using an enum instead of a numeric type:

  • 클라이언트 코드에 대해 변수에 유효한 값을 명확하게 지정합니다.You clearly specify for client code which values are valid for the variable.

  • Visual Studio에서 IntelliSense는 정의된 값을 나열합니다.In Visual Studio, IntelliSense lists the defined values.

열거자 목록의 요소에 대해 값을 지정하지 않으면 값이 자동으로 1씩 증가합니다.When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. 이전 예제에서 Day.Sunday의 값은 0이고, Day.Monday의 값은 1이 되는 식입니다.In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. Day 개체를 만드는 경우 값을 명시적으로 지정하지 않으면 기본값 Day.Sunday(0)가 됩니다.When you create a new Day object, it will have a default value of Day.Sunday (0) if you do not explicitly assign it a value. 열거형을 만들 때 가장 논리적인 기본값을 선택하고 0 값을 지정합니다.When you create an enum, select the most logical default value and give it a value of zero. 그러면 열거형을 만들 때 값을 명시적으로 지정하지 않은 경우 모든 열거형에 해당 기본값이 지정됩니다.That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

meetingDay 변수가 Day 형식이면 명시적 캐스트 없이 Day에 정의된 값 중 하나만 할당할 수 있습니다.If the variable meetingDay is of type Day, then (without an explicit cast) you can only assign it one of the values defined by Day. 또한 모임 날짜가 변경될 경우 Day에서 meetingDay 사이의 새 값을 할당할 수 있습니다.And if the meeting day changes, you can assign a new value from Day to meetingDay:

Day meetingDay = Day.Monday;
//...
meetingDay = Day.Friday;

참고

임의의 정수 값을 meetingDay에 할당할 수 있습니다.It's possible to assign any arbitrary integer value to meetingDay. 예를 들어 meetingDay = (Day) 42 코드 줄은 오류를 생성하지 않습니다.For example, this line of code does not produce an error: meetingDay = (Day) 42. 그러나 열거형 변수는 enum에 정의된 값 중 하나만 포함한다는 암시적 기대로 인해 이렇게 하면 안 됩니다.However, you should not do this because the implicit expectation is that an enum variable will only hold one of the values defined by the enum. 열거형 형식의 변수에 임의의 값을 할당하면 오류가 발생할 위험이 높아집니다.To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

열거형 형식의 열거자 목록에 있는 요소에 값을 할당하고 계산된 값을 사용할 수도 있습니다.You can assign any values to the elements in the enumerator list of an enumeration type, and you can also use computed values:

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

비트 플래그로서 열거형 형식Enumeration types as bit flags

열거형 형식을 사용하여 비트 플래그를 정의할 수 있으며, 그러면 열거형 형식의 인스턴스에서 열거자 목록에 정의된 값의 조합을 저장할 수 있습니다.You can use an enumeration type to define bit flags, which enables an instance of the enumeration type to store any combination of the values that are defined in the enumerator list. 물론, 일부 조합은 의미가 없거나 프로그램 코드에서 허용되지 않을 수 있습니다.(Of course, some combinations may not be meaningful or allowed in your program code.)

AND, OR, NOTXOR 비트 연산을 수행할 수 있도록 System.FlagsAttribute 특성을 적용하고 적절히 값을 정의하여 비트 플래그 열거형을 만듭니다.You create a bit flags enum by applying the System.FlagsAttribute attribute and defining the values appropriately so that AND, OR, NOT and XOR bitwise operations can be performed on them. 비트 플래그 열거형에서 "플래그가 설정되지 않음"을 의미하는 0 값을 갖는 명명된 상수를 포함합니다.In a bit flags enum, include a named constant with a value of zero that means "no flags are set." 0 값이 "플래그가 설정되지 않음"을 의미하지 않는 경우 이 값을 플래그에 지정하지 마세요.Do not give a flag a value of zero if it does not mean "no flags are set".

다음 예제에서는 Days라는 다른 버전의 Day 열거형을 정의합니다.In the following example, another version of the Day enum, which is named Days, is defined. Days에는 Flags 특성이 있고 각 값에는 다음으로 큰 2의 거듭제곱이 할당됩니다.Days has the Flags attribute, and each value is assigned the next greater power of 2. 따라서 값이 Days.Tuesday | Days.ThursdayDays 변수를 만들 수 있습니다.This enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

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

열거형에서 플래그를 설정하려면 다음 예제와 같이 비트 OR 연산자를 사용합니다.To set a flag on an enum, use the bitwise OR operator as shown in the following example:

// Initialize with two flags using bitwise OR.
meetingDays = Days.Tuesday | Days.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

특정 플래그가 설정되어 있는지 확인하려면 다음 예제와 같이 비트 AND 연산을 사용합니다.To determine whether a specific flag is set, use a bitwise AND operation, as shown in the following example:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days.Thursday) == Days.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

System.FlagsAttribute 특성을 사용하여 열거형 형식을 정의할 때 고려할 사항에 대한 자세한 내용은 System.Enum을 참조하세요.For more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

System.Enum 메서드를 사용하여 열거형 값 검색 및 조작Using the System.Enum methods to discover and manipulate enum values

모든 열거형은 System.Enum 형식의 인스턴스입니다.All enums are instances of the System.Enum type. System.Enum에서 새 클래스를 파생시킬 수는 없지만 해당 메서드를 사용하여 열거형 인스턴스에서 값에 대한 정보를 검색하고 값을 조작할 수는 있습니다.You cannot derive new classes from System.Enum, but you can use its methods to discover information about and manipulate values in an enum instance.

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

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

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

자세한 내용은 System.Enum을 참조하세요.For more information, see System.Enum.

또한 확장 메서드를 사용하여 열거형에 대한 새 메서드를 만들 수 있습니다.You can also create a new method for an enum by using an extension method. 자세한 내용은 방법: 새 열거형 메서드 만들기를 참조하세요.For more information, see How to: Create a New Method for an Enumeration.

참고 항목See also