C#/문법 정리

C# - 열거형(enum)

Khadra 2024. 7. 13. 14:21

열거형(enum)

  • 서로 관련 있는 상수들의 집합을 정의한 것이다.
  • 숫자에 특정한 명칭을 붙여주어 의미를 쉽게 이해할 수 있게 하는 용도로 사용된다.
  • 예를 들어, 프로그램에서 사과,바나나,오렌지의 3가지 과일을 사용하는데 각각 0, 1, 2 라는 숫자를 부여해서
    if(fruit == 1)과 같이 사용한다면 나중에 1이 무엇을 의미하는지 이해하기가 어려울 것이다.
    이럴 때 enum을 사용하면 편한 코드를 구상할 수 있다.

예시

// 예시 1
enum fruit
{
    Apple,
    Banana,
    Orange
};
Fruit fruit;

static void Main(string[] args) 
{
    // fruit가 enum Fruit의 Apple와 같다면.
    if (fruit == Fruit.Apple)
    {
        // ...
    }
}
  • 원소로 기술된 명칭을 기호상수라고 부른다.
  • 명시된 순서에 따라 디폴트로 0부터 순서대로 정수값을 갖게 됨

// 예시 2
enum Day 
{
    Sat,
    Sun,
    Mon,
    Tue,
    Wed,
    Thu,
    Fri
}
  • Sat는 0, Sun = 1, Mon = 2, ...와 같이 0부터 순서대로 정수값을 가진다.

// 예시 3
enum Day
{
    Sat,
    Sun,
    Mon,
    Tue,
    Wed,
    Thu,
    Fri = 10
}
  • 기호상수의 값을 지정할 수도 있다.
  • Sat를 1로 설정해주었으므로 그 다음 요소는 2,3,4,...와 같은 값을 갖게되며,
    맨 마지막 Fri는 별도로 10을 지정했으므로 10의 값을 갖게 된다.

// 예시 4
int x = (int)Day.Sun;
  • 열거형 값을 정수로 대입할 때는 (int)로 캐스팅해야 한다.

enum문

  • 클래스 안이나 네임스페이스 내에서만 선언될 수 있다.
  • 즉, 메소드 안이나 프로퍼티 안에서는 선언할 수 없다.
  • Enum클래스에서 제공되는 GetValue()와 GetName()메소드를 사용하여
    enum의 값들을 반복문에서 사용할 수 있다.

예제 코드

using System;
using static System.Console;//Console단어를 생략(코드길이줄어둠)

namespace ConsoleApp1
{
    class Program
    {
        // 4개의 요소값을 갖는 열거형 Size를 정의합니다. 
        // 열거형은 메소드 안에 쓸 수 없고, namespace나 class 안에 위치해야한다.
        enum Size 
        {  
            Short, 
            Tall, 
            Grande, 
            Venti 
        };


        // 정수 배열 price를 정의한다. 
        // enum Size의 각 요소에 해당하는 가격을 표시한다.
        static int[] prive = {  3300, 3800, 4300, 4800 };


        // 열거형 Color를 정의한다.
        // 4개의 요소에 각각 값을 지정한다.
        enum Colors 
        { 
            Red =1, 
            Green = 2, 
            Blue = 4, 
            Yellow = 8 
        };


        // 열거형 Coffee를 정의한다.
        // 사이즈를 기호 상수로 가격을 값으로 지정한다.
        enum Coffee 
        {  
            Short = 3300, 
            Tall = 3800, 
            Grande = 4300, 
            Venti = 4800 
        };

        static void Main(string[] args)
        {
            WriteLine("커피 가격표");

            // 열거형 Size의 각 요소에 대해 가격을 price배열에서 가져와서 출력한다.
            for(int i = 0; i < 4; i++)
            {
                // Size.Short를 출력하면 "Short"이라는 문자열을 출력하고
                // 이를 (int)로 캐스팅하면 기호상수에 해당하는 숫자를 사용할 수 있다.
                if (i == (int)Size.Short)
                    WriteLine("{0,10} : {1:C}", Size.Short, prive[i]);
                else if (i == (int)Size.Tall)
                    WriteLine("{0,10} : {1:C}", Size.Tall, prive[i]);
                else if (i == (int)Size.Grande)
                    WriteLine("{0,10} : {1:C}", Size.Grande, prive[i]);
                else if (i == (int)Size.Venti)
                    WriteLine("{0,10} : {1:C}", Size.Venti, prive[i]);
            }

            WriteLine("\n커피 가격표(Enum iteration)");

            // Enum.GetValues(typeof(Size))를 foreach문에 사용하면 열거형의 각 요소를 반복문에서 사용할 수 있다.
            foreach ( var size in Enum.GetValues(typeof(Size)))
            {
                // 크기와 가격을 출력한다.
                WriteLine("{0,10} : {1:C}", size, prive[(int)size]);
            }

            WriteLine("\nColors Enum iteration");

            // 반복문에서 Colors 열거형의 각 요소 이름과 값을 출력한다.
            foreach(var color in Enum.GetValues(typeof(Colors)))
            {
                WriteLine("{0,10} : {1}", color, Convert.ToInt32(color));
            }

            WriteLine("\n커피 가격표(Enum iteration with value)");

            // eunm Coffee의 각 요소 이름과 값을 출력한다.
            foreach(var coffee in Enum.GetValues(typeof(Coffee)))
            {
                // 이렇게 되면 price[]배열을 사용할 필요가 없다.
                WriteLine("{0,10} : {1:C}", coffee, Convert.ToInt32(coffee));
            }
        }
    }
}

결과

커피 가격표
   Short : ₩3,300
    Tall : ₩3,800
  Grande : ₩4,300
   Venti : ₩4,800

커피 가격표(Enum iteration)
   Short : ₩3,300
    Tall : ₩3,800
  Grande : ₩4,300
   Venti : ₩4,800

Colors Enum iteration
     Red : 1
   Green : 2
    Blue : 4
  Yellow : 8

커피 가격표(Enum iteration with value)
   Short : ₩3,300
    Tall : ₩3,800
  Grande : ₩4,300
   Venti : ₩4,800