enum to string, enum to int, enum foreach, enum count (C#)

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 Example enum to string, enum to int, enum foreach, enum count

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), "안녕하세요");

댓글