C# enum에서 이름과 숫자값 가져오기
C#에서 연습문제를 풀며enum을 공부하다가 처음에 조금 헷갈렸던 부분이 있었다.
enum DeliveryKind
{
Standard = 10,
Express = 20,
Pickup = 30
}
예전에 C나 OpenGL을 배울 때 비슷한 형태를 본 적이 있어서 개념 자체는 낯설지 않았지만 오랜만에 다시 보니 C#에서는 표현 방식이 조금 다르게 느껴졌다.
enum 값 자체
DeliveryKind kind = DeliveryKind.Express;
여기서 kind는 문자열도 아니고 정수도 아니다.
kind의 자료형은 DeliveryKind이다.
kind = DeliveryKind.Express
라는 enum 값을 가지고 있는 것이다.
이 값을 필요에 따라 문자열이나 숫자로 바꿔 사용할 수 있다.
이름을 가져오려면 ToString()
string name = kind.ToString();
kind가 DeliveryKind.Express라면:
"Express"
라는 문자열을 얻을 수 있다.
즉:
kind -> DeliveryKind
kind.ToString() -> string
이다.
따라서
string name = kind;
처럼 바로 대입할 수는 없다.DeliveryKind와 string은 서로 다른 자료형이기 때문이다.
숫자값을 가져오려면 형변환
enum에 지정한 숫자값은 다음처럼 가져올 수 있다.
int intData = (int)kind;
예를 들어 다음과 같이 문제에 접근했다.
DeliveryKind kind = DeliveryKind.Express;
string name = kind.ToString();
int intData = (int)kind;
kind = DeliveryKind.Express
name = "Express"
intData = 20
이 된다고 볼 수 있다. 즉 하나의 enum 값을 필요에 따라 다르게 사용할 수 있다.(매우 중요한 기초개념)
DeliveryKind.Express -> ToString() -> "Express"
DeliveryKind.Express -> (int) -> 20
Enum.GetValues()와 foreach
Array values = Enum.GetValues(typeof(DeliveryKind));
로 enum의 값들을 가져올 수 있다.
foreach(DeliveryKind kind in values)
{
string name = kind.ToString();
int intData = (int)kind;
Console.WriteLine($"{name} = {intData}");
}
반복 과정은 다음처럼 생각하면 이해하기 쉽다.
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 값이고 필요에 따라 이름이나 숫자로 변환해서 사용하는 것이었다.
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
}
그래도 이렇게 글 적으니까 좀 혼동되던 개념들이 정리되는 느낌이 든다. 또 스스로도 생각을 엄청 많이 하며 코드작성을 하는데 마감이 있는 게임업계에서는 많이 선호되지 않는 스타일이라 간략하게 생각하거나 내가 짤 구조를 메모장에 적어두고 최대한 빠르게 코딩하려 하고 있다. 강사님이나 다른 잘하는 친구들을 보면 아직 스스로에게 불만족스럽다. 계속해서 스스로를 채워가며 내 가능성을 더 키워야겠다.



