Enum과 관련하여 간단한 예시자료를 모아보았습니다. enum to string, enum to int, foreach, count 그리고 그 반대의 경우에 대한 예제입니다.
- enum이 무엇인가요?
- enum to string
- enum to int
- string to enum
- int to enum
- enum foreach
- enum count
- 전달된 값은 Int32와 같이 열거형 기본 또는 열거형 내부 형식이어야 합니다.
Enum이 무엇인가요?
enum은 enumeration 또는 enumerated type을 뜻하며 한국에서는 보통 "열거형", "이넘"이라고 지칭합니다. C#뿐만 아니라 C, C++, 자바 등 여러 언어에 등장합니다. 열거형은 기본적으로 제공되기도 하며, 사용자가 직접 정의할 수도 있습니다. 기본 제공(원시 데이터 타입)의 예를 들면, 환경변수 열거 값을 조회하면 프로세스, 유저 및 머신이 있습니다. 다음은 환경변수(EnvironmentVariableTarget)에 있는 열거형 변수 목록입니다.
//
// 요약:
// set 또는 get 작업에서 환경 변수가 저장되거나 검색되는 위치를 지정합니다.
[ComVisible(true)]
public enum EnvironmentVariableTarget
{
//
// 요약:
// 환경 변수는 현재 프로세스와 연결된 환경 블록에서 저장되거나 검색됩니다.
Process = 0,
//
// 요약:
// 환경 변수는 Windows 운영 체제 레지스트리의 HKEY_CURRENT_USER\Environment 키에서 저장되거나 검색됩니다.
User = 1,
//
// 요약:
// 환경 변수는 Windows 운영 체제 레지스트리의 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session
// Manager\Environment 키에서 저장되거나 검색됩니다.
Machine = 2
}
각각 열거형 타입이 0, 1, 2로 선언이 되어있는 것에서 볼 수 있듯이 C# 열거형은 정수 타입과 호환이 되는 포맷입니다. 그리고 열거형을 사용하는 핵심은 해당 타입에서 사용할 수 있는 멤버 집합을 설정하여, 해당 자료형이 어떠한 값으로 구성되어 있는지 직관적으로 파악할 수 있도록 합니다. 이러한 방법을 통해 상수만을 선언하였을 때보다 값을 쉽게 확인이 가능하며, 관계의 설정 및 허용할 수 있는 값 제한 등의 이점이 있습니다.
아래에서 사용하는 예시 이넘은 다음과 같습니다. 아래에 설명이 또 있으니 자세히 안 보셔도 괜찮습니다.
enum EnumName
{
안녕하세요,
감사해요,
잘있어요,
다시만나요
}
private void BeomSang()
{
string value;
EnumName enumName;
txt.Text += "[enum to string (1)]";
txt.Text += EnumName.다시만나요.ToString();
txt.Text += "[enum to string (2)]";
txt.Text += Convert.ToString(EnumName.다시만나요);
txt.Text += "[enum to int (1)]";
txt.Text += (int)EnumName.감사해요;
txt.Text += "[enum to int (2)]";
txt.Text += Convert.ToInt32(EnumName.감사해요);
txt.Text += "[int to enum]";
txt.Text += Enum.ToObject(typeof(EnumName), 2);
txt.Text += "[string to enum]";
txt.Text += (EnumName)Enum.Parse(typeof(EnumName), "다시만나요");
txt.Text += "[string to enum (try parse)]";
value = "다시만나요";
if (Enum.TryParse(value, out enumName))
txt.Text += enumName;
else
txt.Text += $"Try parse \"{value}\" returns false";
txt.Text += "[string to enum (try parse returns false)]";
value = "범상입니다";
if (Enum.TryParse(value, out enumName))
txt.Text += enumName;
else
txt.Text += $"Try parse \"{value}\" returns false";
txt.Text += "[enum foreach]";
foreach (var v in Enum.GetValues(typeof(EnumName)))
{
txt.Text += v;
}
txt.Text += "[enum count (1)]";
txt.Text += "Count : " + Enum.GetValues(typeof(EnumName)).Length;
txt.Text += "[enum count (2)]";
txt.Text += "Count : " + Enum.GetValues(enumName.GetType()).Length;
//오류
//txt.Text = Enum.GetName(typeof(EnumName), "2");
//txt.Text += Enum.ToObject(typeof(EnumName), "2");
//txt.Text += Enum.ToObject(typeof(EnumName), "안녕하세요");
}
Enum to String
이넘을 스트링으로 변경하는 경우에는 ToString() 또는 Convert.ToString 메서드를 이용할 수 있습니다.
txt.Text += "[enum to string (1)]";
txt.Text += EnumName.다시만나요.ToString();
txt.Text += "[enum to string (2)]";
txt.Text += Convert.ToString(EnumName.다시만나요);
예제 자료는 이미 Text에 값이 할당되어 있어서 ToString()을 생략하여도 형변환이 이루어지는데, 생략하는 경우에는 다음과 같은 오류가 발생합니다.
string s = EnumName.다시만나요;
=>
오류 CS0029 암시적으로 'EnumName' 형식을 'string' 형식으로 변환할 수 없습니다.
Enum to Int
이넘은 정수 타입과 호환이 가능하여 바로 형변환 연산자를 설정하여 명시하여도 됩니다.
txt.Text += "[enum to int (1)]";
txt.Text += (int)EnumName.감사해요;
txt.Text += "[enum to int (2)]";
txt.Text += Convert.ToInt32(EnumName.감사해요);
String to Enum
Enum 클래스의 파싱을 사용하는 예제입니다. Parse 메서드와 TryParse 메서드를 이용하였습니다.
txt.Text += "[string to enum]";
txt.Text += (EnumName)Enum.Parse(typeof(EnumName), "다시만나요");
txt.Text += "[string to enum (try parse)]";
value = "다시만나요";
if (Enum.TryParse(value, out enumName))
txt.Text += enumName;
else
txt.Text += $"Try parse \"{value}\" returns false";
txt.Text += "[string to enum (try parse returns false)]";
value = "범상입니다";
if (Enum.TryParse(value, out enumName))
txt.Text += enumName;
else
txt.Text += $"Try parse \"{value}\" returns false";
Enum.Parse 메서드를 사용할 때에는 문자열이 열거형에 있지 않을 때 다음과 같은 예외가 발생합니다.
이러한 예외사항을 방지하고 싶다면 out 키워드와 함께 사용하는 Enum.TryParse 메서드를 사용하세요.
txt.Text += (EnumName)Enum.Parse(typeof(EnumName), "범상입니다");
=>
처리되지 않은 'System.ArgumentException' 형식의 예외가 mscorlib.dll에서 발생했습니다.
추가 정보: 요청한 값 '범상입니다'을(를) 찾을 수 없습니다.
Int to Enum
Enum 클래스의 ToObject 메서드를 이용하여 이넘 멤버로 변환할 수 있습니다.
txt.Text += "[int to enum]";
txt.Text += Enum.ToObject(typeof(EnumName), 2);
이넘의 멤버에 있지 않은 정수를 지정하면 정수를 그대로 반환합니다.
예시자료(안녕하세요 = 0, 감사해요 = 1, 잘있어요 = 2, 다시만나요 = 3)에서 4까지 넣어봤을 때 출력은 다음과 같습니다. 4에 해당하는 멤버가 없기 때문에 4를 반환합니다.
txt.Text += Enum.ToObject(typeof(EnumName), 0);
txt.Text += Enum.ToObject(typeof(EnumName), 1);
txt.Text += Enum.ToObject(typeof(EnumName), 2);
txt.Text += Enum.ToObject(typeof(EnumName), 3);
txt.Text += Enum.ToObject(typeof(EnumName), 4);
=>
안녕하세요
감사해요
잘있어요
다시만나요
4
Enum foreach
Enum 클래스에서 GetValues메서드로 배열(Array)을 반환하거나, GetNames메서드로 상수 이름 배열을 검색할 수 있습니다. 예제 자료는 GetValues 결과 배열에 대해 반복문을 설정해 봅니다.
txt.Text += "[enum foreach]";
foreach (var v in Enum.GetValues(typeof(EnumName)))
{
txt.Text += v;
}
Enum count
Enum Count는 foreach와 마찬가지로 GetValues 또는 GetNames로 확인할 수 있습니다. 예제는 GetValues로 진행합니다.
txt.Text += "[enum count (1)]";
txt.Text += "Count : " + Enum.GetValues(typeof(EnumName)).Length;
txt.Text += "[enum count (2)]";
txt.Text += "Count : " + Enum.GetValues(enumName.GetType()).Length;
전달된 값은 Int32와 같이 열거형 기본 또는 열거형 내부 형식이어야 합니다.
Enum클래스의 ToObject, GetName 등의 메서드를 사용할 때 전달 값을 Int 타입이 아닌 경우에 발생하는 예외입니다.
//예외 발생
txt.Text = Enum.GetName(typeof(EnumName), "2");
txt.Text += Enum.ToObject(typeof(EnumName), "2");
txt.Text += Enum.ToObject(typeof(EnumName), "안녕하세요");