C# enum에서 이름과 숫자값 가져오기

송제백
∙∙조회 0

C#에서 연습문제를 풀며enum을 공부하다가 처음에 조금 헷갈렸던 부분이 있었다.

csharp
enum DeliveryKind
{
    Standard = 10,
    Express = 20,
    Pickup = 30
}

예전에 C나 OpenGL을 배울 때 비슷한 형태를 본 적이 있어서 개념 자체는 낯설지 않았지만 오랜만에 다시 보니 C#에서는 표현 방식이 조금 다르게 느껴졌다.

enum 값 자체

csharp
DeliveryKind kind = DeliveryKind.Express;

여기서 kind는 문자열도 아니고 정수도 아니다.

kind의 자료형은 DeliveryKind이다.

text
kind = DeliveryKind.Express

라는 enum 값을 가지고 있는 것이다.

이 값을 필요에 따라 문자열이나 숫자로 바꿔 사용할 수 있다.

이름을 가져오려면 ToString()

csharp
string name = kind.ToString();

kind가 DeliveryKind.Express라면:

text
"Express"

라는 문자열을 얻을 수 있다.

즉:

text
kind            -> DeliveryKind
kind.ToString() -> string

이다.

따라서

csharp
string name = kind;

처럼 바로 대입할 수는 없다.DeliveryKind와 string은 서로 다른 자료형이기 때문이다.

숫자값을 가져오려면 형변환

enum에 지정한 숫자값은 다음처럼 가져올 수 있다.

csharp
int intData = (int)kind;

예를 들어 다음과 같이 문제에 접근했다.

csharp
DeliveryKind kind = DeliveryKind.Express;

string name = kind.ToString();
int intData = (int)kind;
text
kind    = DeliveryKind.Express
name    = "Express"
intData = 20

이 된다고 볼 수 있다. 즉 하나의 enum 값을 필요에 따라 다르게 사용할 수 있다.(매우 중요한 기초개념)

text
DeliveryKind.Express -> ToString() -> "Express"
DeliveryKind.Express -> (int)      -> 20

Enum.GetValues()와 foreach

csharp
Array values = Enum.GetValues(typeof(DeliveryKind));

로 enum의 값들을 가져올 수 있다.

csharp
foreach(DeliveryKind kind in values)
{
    string name = kind.ToString();
    int intData = (int)kind;

    Console.WriteLine($"{name} = {intData}");
}

반복 과정은 다음처럼 생각하면 이해하기 쉽다.

text
1회차
kind = DeliveryKind.Standard
name = "Standard"
intData = 10

2회차
kind = DeliveryKind.Express
name = "Express"
intData = 20

3회차
kind = DeliveryKind.Pickup
name = "Pickup"
intData = 30

처음에는 kind가 enum의 이름을 가져오는 것이라고 생각했는데, 정확히는 kind 자체가 enum 값이고 필요에 따라 이름이나 숫자로 변환해서 사용하는 것이었다.

cshap
using System;

class Program
{
    static void Main()
    {
        Console.Write("입력 개수: ");
        int count = int.Parse(Console.ReadLine());

        Array values = Enum.GetValues(typeof(DeliveryKind));

        int standardCount = 0;
        int expressCount = 0;
        int pickupCount = 0;
        int rejectCount = 0;

        for (int i = 0; i < count; i++)
        {
            Console.Write($"{i + 1}번 배송 구분: ");
            string input = Console.ReadLine();

            input = input.Trim();

            if (input.Contains(","))
            {
                Console.WriteLine("거절");
                rejectCount++;
                continue;
            }

            bool checkFlag = false;

            foreach (DeliveryKind kind in values)
            {
                string name = kind.ToString();
                string numData = ((int)kind).ToString();

                if (input.Equals(name, StringComparison.OrdinalIgnoreCase)
                    || input == numData)
                {
                    Console.WriteLine($"접수: {kind}");

                    if (kind == DeliveryKind.Standard)
                    {
                        standardCount++;
                    }
                    else if (kind == DeliveryKind.Express)
                    {
                        expressCount++;
                    }
                    else if (kind == DeliveryKind.Pickup)
                    {
                        pickupCount++;
                    }

                    checkFlag = true;
                    break;
                }
            }

            if (checkFlag == false)
            {
                Console.WriteLine("거절");
                rejectCount++;
            }
        }
        Console.WriteLine();
        Console.WriteLine($"Standard: {standardCount}");
        Console.WriteLine($"Express: {expressCount}");
        Console.WriteLine($"Pickup: {pickupCount}");
        Console.WriteLine($"거절: {rejectCount}");
    }
}
enum DeliveryKind
{
    Standard = 10,
    Express = 20,
    Pickup = 30
}

그래도 이렇게 글 적으니까 좀 혼동되던 개념들이 정리되는 느낌이 든다. 또 스스로도 생각을 엄청 많이 하며 코드작성을 하는데 마감이 있는 게임업계에서는 많이 선호되지 않는 스타일이라 간략하게 생각하거나 내가 짤 구조를 메모장에 적어두고 최대한 빠르게 코딩하려 하고 있다. 강사님이나 다른 잘하는 친구들을 보면 아직 스스로에게 불만족스럽다. 계속해서 스스로를 채워가며 내 가능성을 더 키워야겠다.