Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 현재 열거형(Enum)의 기본 형식(Underlying Type) 가져오는 방법

C#에서 GetEnumUnderlyingType() 메서드를 사용하면 현재 열거형(enum)이 내부적으로 사용하는 기본 형식(underlying type)을 확인할 수 있습니다. 별도로 지정하지 않으면 모든 열거형은 기본적으로 int(System.Int32)를 기본 형식으로 가집니다.

예제 1 – 열거형의 기본 형식 조회

다음은 Vehicle이라는 열거형의 상수 이름과 기본 형식을 함께 출력하는 예제입니다.

using System;
public class Demo {
    enum Vehicle { Car, Bus, Bike, Airplane }

    public static void Main() {
        try {
            Vehicle v = Vehicle.Bike;
            Type type = v.GetType();

            string[] str = type.GetEnumNames();
            Console.WriteLine("GetEnumNames()가 반환한 상수 이름 배열 = " + str);

            Type type2 = type.GetEnumUnderlyingType();
            Console.Write("열거형의 기본 형식 = " + type2);

            Console.WriteLine("\n상수 목록 출력..");
            for (int i = 0; i < str.Length; i++)
                Console.Write("{0} ", str[i]);
        }
        catch (ArgumentException e) {
            Console.WriteLine("열거형이 아닙니다!");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

GetEnumNames()가 반환한 상수 이름 배열 = System.String[]
열거형의 기본 형식 = System.Int32
상수 목록 출력..
Car Bus Bike Airplane

출력에서 알 수 있듯이, GetEnumNames()는 상수 이름들이 담긴 문자열 배열(System.String[])을 반환하고, GetEnumUnderlyingType()은 이 열거형의 실제 저장 방식인 System.Int32(int)를 반환합니다.

예제 2 – 열거형이 아닌 경우 예외 처리

만약 대상 형식이 열거형이 아니라면 어떻게 될까요? 아래 예제처럼 일반 타입(int)에 대해 같은 메서드를 호출해 보겠습니다.

using System;
public class Demo {
    enum Vehicle { Car, Bus, Bike, Airplane }

    public static void Main() {
        try {
            Type type = typeof(int); // 열거형이 아닌 형식

            string[] str = type.GetEnumNames();
            Console.WriteLine("GetEnumNames()가 반환한 상수 이름 배열 = " + str);

            Type type2 = type.GetEnumUnderlyingType();
            Console.Write("열거형의 기본 형식 = " + type2);
        }
        catch (ArgumentException e) {
            Console.WriteLine("열거형이 아닙니다!");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

출력 결과

열거형이 아닙니다!
System.ArgumentException

typeof(int)처럼 열거형이 아닌 형식에 대해 GetEnumNames()GetEnumUnderlyingType()을 호출하면 ArgumentException 예외가 발생합니다. 따라서 런타임에 형식이 불확실한 경우에는 반드시 try-catch 블록으로 감싸 예외를 처리하는 것이 안전합니다.

정리

  • Type.GetEnumUnderlyingType(): 현재 열거형의 기본 형식을 반환합니다. 지정하지 않으면 int입니다.
  • Type.GetEnumNames(): 열거형에 정의된 상수 이름들을 string[] 배열로 반환합니다.
  • 대상 형식이 열거형이 아니면 ArgumentException이 발생하므로 예외 처리를 권장합니다.