C#에서 현재 열거형(enumeration) 타입에 정의된 멤버들의 이름을 확인하고 싶다면, Type 클래스의 GetEnumNames() 메서드를 활용하면 됩니다. 이 메서드는 열거형에 포함된 상수 이름들을 문자열 배열(string[]) 형태로 반환해 주며, 대상 타입이 열거형이 아닐 경우 ArgumentException 예외가 발생한다는 점에 유의해야 합니다.
GetEnumNames() 메서드란?
GetEnumNames()는 System 네임스페이스의 Type 클래스에 정의된 메서드로, 호출된 Type 객체가 나타내는 열거형의 모든 상수 멤버 이름을 선언된 순서대로 문자열 배열에 담아 반환합니다. 이때 반환되는 것은 상수의 '값'이 아니라 '이름'이라는 점을 기억해 두면 좋습니다.
예제 1: 열거형이 아닌 타입에 적용한 경우
먼저, 열거형이 아닌 타입(string)에 GetEnumNames()를 호출하면 어떻게 되는지 살펴보겠습니다.
using System;
public class Demo {
enum Vehicle { Car, Bus, Bike }
public static void Main() {
try {
Type type = typeof(string);
string[] str = type.GetEnumNames();
Console.WriteLine("GetEnumNames()가 반환한 상수 이름 = " + str);
Console.WriteLine("상수 목록 출력..");
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);
}
}
}실행 결과
string 타입은 열거형이 아니므로 다음과 같이 예외가 발생하고 catch 블록이 실행됩니다.
열거형이 아닙니다! System.ArgumentException
예제 2: 실제 열거형에 적용한 경우
이번에는 실제 열거형 변수에 GetType()을 호출해 Type 객체를 얻은 뒤, GetEnumNames()를 적용해 보겠습니다.
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);
Console.WriteLine("상수 목록 출력..");
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);
}
}
}실행 결과
Vehicle 열거형의 모든 멤버 이름이 선언 순서대로 출력됩니다.
GetEnumNames()가 반환한 상수 이름 = System.String[] 상수 목록 출력.. Car Bus Bike airplane
핵심 정리 및 참고 사항
- typeof() vs GetType(): 특정 타입 자체를 지정할 때는 typeof(T)를, 인스턴스로부터 타입 정보를 얻을 때는 GetType()을 사용합니다.
- 예외 처리: 열거형이 아닌 타입에 GetEnumNames()를 호출하면 ArgumentException이 발생하므로, try-catch 블록으로 감싸 안전하게 처리하는 것이 좋습니다.
- 배열 출력 주의: 문자열 연결 시 배열을 그대로 이어 붙이면 "System.String[]"처럼 타입 이름만 출력됩니다. 실제 내용을 보려면 반복문 또는
string.Join(" ", str)을 활용하는 것이 좋습니다. - 반환 순서: 멤버 이름은 소스 코드에서 선언된 순서대로 반환됩니다.