본문 바로가기
C#/이론

[예제로 배우는 C# 프로그래밍] 열거형 enum

by 단월໒꒱ 2022. 7. 3.

 

C# 열거형 enum

 

 

enum (열거형)

 

  C#의 키워드 enum은 열거형 상수(constant)를 표현하기 위한 것으로, 이를 이용하면 상수 숫자들을 보다 의미있는 단어들로 표현할 수 있어 프로그램을 읽기 쉽게 해준다.

 

  enum의 각 요소는 별도로 지정하지 않으면 첫번째 요소가 0, 두번재 요소가 1.... 처럼 1씩 증가된 값들을 할당 받는다. 

 

  enum문은 클래스 안이나 네임스페이스 내에서만 선언될 수 있다. (메스드 안이나 속성 안에서는 선언되지 않는다.)

 

 

  다음 예제는 Category라는 enum 타입을 정의한 예이다. Cake는 0, IceCream은 1, Bread는 2 값을 갖는다.

 

 

public enum Category
{
   Cake,
   IceCream,
   Bread
}

 

 

 

enum의 사용

 

  enum 타입은 숫자형 타입과 호환이 가능하다. enum 타입의 변수를 int로 캐스팅하면 해당 enum 값의 숫자 값을 얻게 된다. 또한 enum 타입의 변수는 enum 리터럴 값과 서로 비교할 수 있다.

 

 

다음 예제는 enum 변수 myCity가 리터럴 City.Seoul과 같은지 체크하는 코드이다.

 

 

class Program
{
    enum City
    {
        Seoul,   // 0
        Daejun,  // 1
        Busan = 5,  // 5
        Jeju = 10   // 10
    }

    static void Main(string[] args)
    {
        City myCity;
        
        // enum 타입에 값을 대입하는 방법
        myCity = City.Seoul;

        // enum을 int로 변환(Casting)하는 방법. 
        // (int)를 앞에 지정.
        int cityValue = (int) myCity; 

        if (myCity == City.Seoul) // enum 값을 비교하는 방법
        {
            Console.WriteLine("Welcome to Seoul");
        }
    }
}

 

 

 

플래그(flag) enum

 

  enum의 각 멤버들은 각 비트별로 구분되는 값들(ex. 1, 2, 4,8, ...)을 가질 수 있는데, 이렇게 enum 타입이 비트 필드를 갖는다는 것을 표시하기 위해 enum 선언문 바로 위에 [Flags]라는 Attribute를 지정할 수 있다.

 

  [Flags] 특성을 갖는 플래그 enum은 OR 연산자를 이용해서 한 enum 변수에 다중값(ex. 1+4)을 가질 수 있으며, AND 연산자를 이용하여 enum 변수가 특정 멤버를 포함하고 있는지 체크할 수 있다.

 

 

  다음 예제는 Border라는 플래그 enum으로 OR 연산을 통해 다중값을 표현하고, AND 연산을 통해 특정 멤버를 체크해보는 코드이다. 또한, 플래그 enum에 대해 .ToString() 메서드를 사용하면 해당 플래그 멤버명들을 문자열로 보여준다는 것이다. [Flags]가 없으면 1+4, 즉 5를 출력한다.

 

 

[Flags]
enum Border
{
    None = 0,
    Top = 1,
    Right = 2,
    Bottom = 4,
    Left = 8
}

static void Main(string[] args)
{
    // OR 연산자로 다중 플래그 할당
    Border b = Border.Top | Border.Bottom;

    // & 연산자로 플래그 체크
    if ((b & Border.Top) != 0)
    {
        //HasFlag()이용 플래그 체크
        if (b.HasFlag(Border.Bottom))
        {
            // "Top, Bottom" 출력
            Console.WriteLine(b.ToString());
        }
    }
}

 

 

 

 

 

댓글