다음을 통해 공유


열거형 형식(C# 참조)

열거형 형식(또는 열거형 형식)은 기본 정수 숫자 형식의 명명된 상수 집합에 의해 정의된 형식입니다. 열거형 형식을 정의하려면 키워드를 enum 사용하고 열거형 멤버의 이름을 지정합니다.

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

기본적으로 열거형 멤버의 연결된 상수 값은 형식 int이며, 0으로 시작하고 정의 텍스트 순서에 따라 1씩 증가합니다. 다른 정수 숫자 형식을 열거형 형식의 기본 형식으로 명시적으로 지정할 수 있습니다. 다음 예제와 같이 연결된 상수 값을 명시적으로 지정할 수도 있습니다.

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

열거형 형식의 정의 내에 메서드를 정의할 수 없습니다. 열거형 형식에 기능을 추가하려면 확장 멤버를 만듭니다.

열거형 형식 E 의 기본값은 0에 해당하는 열거형 멤버가 없더라도 식 (E)0으로 생성되는 값입니다.

0에서 암시적 변환

C#에서는 리터럴 값 0 에서 모든 열거형 형식으로, 0과 같은 값에서 const 암시적으로 변환할 수 있습니다. 이 동작으로 인해 열거형에 값이 0인 멤버가 포함되지 않은 경우 예기치 않은 결과가 발생할 수 있습니다.

public enum GpioPort
{
    GpioA = 1,
    GpioB,
    GpioC,
    GpioD
}

public class ZeroConversionExample
{
    public static void Main()
    {
        // This compiles without warning but creates an invalid enum value
        GpioPort port1 = (GpioPort)0;
        Console.WriteLine($"port1: {port1}"); // Output: port1: 0

        // This also compiles due to implicit conversion from zero
        GpioPort port2 = GetPort(0);
        Console.WriteLine($"port2: {port2}"); // Output: port2: 0

        // Check if the enum value is valid
        bool isValid1 = Enum.IsDefined(typeof(GpioPort), port1);
        bool isValid2 = Enum.IsDefined(typeof(GpioPort), port2);
        Console.WriteLine($"port1 is valid: {isValid1}"); // Output: port1 is valid: False
        Console.WriteLine($"port2 is valid: {isValid2}"); // Output: port2 is valid: False

        // Safer approach - validate enum values
        if (Enum.IsDefined(typeof(GpioPort), 0))
        {
            GpioPort safePort = (GpioPort)0;
        }
        else
        {
            Console.WriteLine("Value 0 is not a valid GpioPort");
            // Handle the invalid case appropriately
        }
    }

    public static GpioPort GetPort(GpioPort port)
    {
        return port;
    }
}

앞의 예제에서는 둘 다 port1 값이 port2 할당되지만 0 해당 값을 GpioPort가진 멤버는 없습니다. 메서드는 Enum.IsDefined 이러한 값이 잘못된 열거형 값인 것을 확인합니다.

이 암시적 변환은 0비트 패턴이 모든 열거형 형식을 비롯한 모든 구조체 형식의 기본값이기 때문에 존재합니다. 그러나 코드에 버그가 발생할 수 있습니다. 이러한 문제를 방지하려면:

  • 거의 항상 열거형에 값 0 이 있는 멤버를 정의해야 합니다.
  • 숫자 형식에서 변환할 때 열거형 값의 유효성을 검사하는 데 사용합니다 Enum.IsDefined .
  • 암시적으로 열거형 형식으로 변환될 수 있는 숫자 매개 변수를 사용할 때는 주의해야 합니다.

열거형 형식을 사용하여 상호 배타적인 값 집합 또는 선택 항목의 조합에서 선택한 항목을 나타냅니다. 선택 항목의 조합을 나타내려면 열거형 형식을 비트 플래그로 정의합니다.

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

열거형 형식이 선택 항목의 조합을 나타내려면 개별 선택이 비트 필드가 되도록 해당 선택 항목에 대한 열거형 멤버를 정의합니다. 즉, 해당 열거형 멤버의 연결된 값은 2의 권한이어야 합니다. 그런 다음 비트 논리 연산 | 자를 사용하거나 & 선택 항목을 결합하거나 선택 항목의 조합을 각각 교차할 수 있습니다. 열거형 형식이 비트 필드를 선언함을 나타내려면 Flags 특성을 적용합니다. 다음 예제와 같이 열거형 형식의 정의에 몇 가지 일반적인 조합을 포함할 수도 있습니다.

[Flags]
public enum Days
{
    None      = 0b_0000_0000,  // 0
    Monday    = 0b_0000_0001,  // 1
    Tuesday   = 0b_0000_0010,  // 2
    Wednesday = 0b_0000_0100,  // 4
    Thursday  = 0b_0000_1000,  // 8
    Friday    = 0b_0001_0000,  // 16
    Saturday  = 0b_0010_0000,  // 32
    Sunday    = 0b_0100_0000,  // 64
    Weekend   = Saturday | Sunday
}

public class FlagsEnumExample
{
    public static void Main()
    {
        Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
        Console.WriteLine(meetingDays);
        // Output:
        // Monday, Wednesday, Friday

        Days workingFromHomeDays = Days.Thursday | Days.Friday;
        Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
        // Output:
        // Join a meeting by phone on Friday

        bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
        Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
        // Output:
        // Is there a meeting on Tuesday: False

        var a = (Days)37;
        Console.WriteLine(a);
        // Output:
        // Monday, Wednesday, Saturday
    }
}

자세한 내용 및 예제는 System.FlagsAttribute API 참조 페이지와 비독점 멤버 및 API 참조 페이지의 Flags 특성 섹션을 System.Enum 참조하세요.

System.Enum 형식 및 열거형 제약 조건

형식은 System.Enum 모든 열거형 형식의 추상 기본 클래스입니다. 열거형 형식 및 해당 값에 대한 정보를 가져오는 여러 메서드를 제공합니다. 자세한 내용 및 예제는 API 참조 페이지를 참조 System.Enum 하세요.

기본 클래스 제약 조건(System.Enum 조건이라고 함)에서 형식 매개 변수가 열거형 형식임을 지정할 수 있습니다. 모든 열거형 형식은 형식 매개 변수가 nullable이 아닌 값 형식임을 지정하는 데 사용되는 제약 조건을 충족 struct 합니다.

변환

열거형 형식의 경우 열거형 형식과 해당 기본 정수 형식 간에 명시적 변환이 존재합니다. 열거형 값을 내부 형식으로 캐스팅 하면 결과는 열거형 멤버의 연결된 정수 값입니다.

public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

public class EnumConversionExample
{
    public static void Main()
    {
        Season a = Season.Autumn;
        Console.WriteLine($"Integral value of {a} is {(int)a}");  // output: Integral value of Autumn is 2

        var b = (Season)1;
        Console.WriteLine(b);  // output: Summer

        var c = (Season)4;
        Console.WriteLine(c);  // output: 4
    }
}

이 메서드를 Enum.IsDefined 사용하여 열거형 형식에 특정 관련 값이 있는 열거형 멤버가 포함되어 있는지 여부를 확인합니다.

열거형 형식의 경우, 각각 boxing 및 unboxing 변환이System.Enum 형식에 대해 존재합니다.

C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.

참고하십시오