Enum

  • 기본값으로 첫번째 요소가 0, 두번째가 1, 세번째가 2, … 1씩 증가하는 값들을 할당받는다.
    • 임의의 값을 지정할 수 있다.
  • 클래스나 네임스페이스 안에서만 선언 가능하다.
    • 메서드나 속성 안에서는 안된다.
  • enum 타입은 숫자형 타입과 호환이 가능하다.
    • enum 타입의 변수를 int로 캐스팅 가능하다.
    • int 값을 enum 타입으로 캐스팅 가능하다.
  • enum 타입의 변수는 enum 리터럴값과 비교할 수 있다.
using System;

namespace MyNamespace
{
    class MyApp
    {
        enum Language
        {
            C, // 0
            CPP, // 1
            CS, // 2
            Python = 100,
            Javascript = 200,
            Typescript, // 201
        }

        static void Main(string[] args)
        {
            Language lang;
            lang = Language.Typescript;
            int i = (int)lang;

            if (lang != Language.Javascript)
            {
                Console.WriteLine("True");
            }

            if ((Language)(i-1) == Language.Javascript)
            {
                Console.WriteLine("True");
            }
        }
    }
}

Flag Enum

  • Enum을 비트 플래그 용도로 사용할 수 있다.
  • enum 선언문 바로 위에 [Flags] Attribute를 지정해서 사용.
    • Attribute: 데이터 타입 혹은 멤버 선언시 그 위에 붙이는 특별한 설정값.
  • 비트 OR(|) 연산자로 여러 플래그 상태를 합칠 수 있다.
  • 비트 AND(&) 연산자로 특정 플래그 상태를 얻을 수 있다.
using System;

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

        static void Main(string[] args)
        {
            Border b;

            // OR
            b = Border.Left | Border.Right;

            // AND
            if ((b & Border.Left) != 0)
            {
                Console.WriteLine("True");
            }

            // HasFlag()
            if (b.HasFlag(Border.Right))
            {
                Console.WriteLine("True");
            }

            // RESULT: Left, Right
            Console.WriteLine(b.ToString());
        }
    }
}

참고자료