[C#] 열거형(Enumeration Type)

Running boy·2023년 8월 6일
0

컴퓨터 공학

목록 보기
16/36

enum

정수 계열의 타입(byte, sbyte, short, ushort, int, uint, long, ulong)만을 상속받아 정의할 수 있는 사용자 정의 타입이다.

숫자형 값에 문자열 식별자를 부여할 수 있으며 상속 타입을 지정하지 않을 경우 기본적으로 System.Int32이다.

[접근 제한자] enum [타입명] : [상속 타입(생략 가능)]
{
    // [식별자1], ...
}

enum의 특징

  1. enum은 ToString 메서드를 재정의했기 때문에 출력하면 식별자를 문자열로 반환한다.
  2. enum에서 정수 계열의 타입으로 혹은 반대로 형변환하는 경우, 반드시 명시적으로 형변환을 해줘야 된다.
  3. 만약 enum에 정의되지 않은 값을 enum 타입으로 형변환 할 경우 값이 그대로 출력된다.
  4. +- 연산자를 재정의했기 때문에 간단하게 값 조정이 가능하다.
class Program
{
    enum TestEnum
    {
        ID1 = 1,
        ID2 = 3
    }
    
    static void Main(string[] args)
    {
        int n = (int)TestEnum.ID1; // enum -> int 명시적 형변환

        Console.WriteLine((TestEnum)n); // int -> enum 명시적 형변환
        n++;
        Console.WriteLine((TestEnum)n); // 2에 해당하는 enum값이 정의되지 않았으므로 그대로 2 출력
        n++;
        TestEnum newEnum = (TestEnum)n;
        Console.WriteLine(newEnum);
        Console.WriteLine(newEnum - 2); // 형변환 없이 바로 enum을 int처럼 연산
    }
}

// 출력:
// ID1
// 2
// ID2
// ID1

Flags Attribute

enum은 아래와 같이 flag로 사용할 수 있다.

class Program
{
    public enum Days : Byte
    {
        Sunday = 1,     // 0b00000001
        Monday = 2,     // 0b00000010
        Tuesday = 4,    // 0b00000100
        Wednesday = 8,  // 0b00001000
        Thursday = 16,  // 0b00010000
        Friday = 32,    // 0b00100000
        Saturday = 64   // 0b01000000
    }
    
    static void Main(string[] args)
    {
        Days workingDays = Days.Monday | Days.Tuesday | Days.Wednesday | Days.Thursday | Days.Friday; // 0b00111110

        Console.WriteLine(workingDays.HasFlag(Days.Sunday));
        Console.WriteLine(workingDays.HasFlag(Days.Monday));

        Console.WriteLine(workingDays);
    }
}

// 출력:
// False
// True
// 62

HasFlag 메서드는 '&' 비트 연산을 수행해서 flag가 있을 경우(한개 이상의 비트가 1일 경우) True를 반환한다.

이를 활용할 경우 객체의 상태를 표현할 때(특히 상태가 중첩이 가능할 때) 유용하다.

하지만 비트 연산의 결과값인 workingDays를 그대로 출력하면 0b00111110을 10진수로 변환한 62가 출력된다.
(62에 해당하는 enum값이 정의되지 않았기 때문)

10진수가 아니라 식별자 개개인을 출력해야 flag로써의 의미가 있다.

아래와 같이 enum을 정의할 때 Flags Attribute를 지정하면 원하는 결과가 출력된다.

class Program
{
    [Flags]
    public enum Days : Byte
    {
        Sunday = 1,     // 0b00000001
        Monday = 2,     // 0b00000010
        Tuesday = 4,    // 0b00000100
        Wednesday = 8,  // 0b00001000
        Thursday = 16,  // 0b00010000
        Friday = 32,    // 0b00100000
        Saturday = 64   // 0b01000000
    }
    
    static void Main(string[] args)
    {
        Days workingDays = Days.Monday | Days.Tuesday | Days.Wednesday | Days.Thursday | Days.Friday; // 0b00111110
        Console.WriteLine(workingDays);

        string daysToString = workingDays.ToString();
        Console.WriteLine(daysToString);

        Console.WriteLine((Days)5); // 0b00000101
    }
}

// 출력:
// Monday, Tuesday, Wednesday, Thursday, Friday
// Monday, Tuesday, Wednesday, Thursday, Friday
// Sunday, Tuesday

정수값을 enum으로 변환할 때 만약 해당 정의가 없으면 정의된 값의 합으로 표현 가능한지 판단한 후 배열의 문자열로 표기해준다.


참고 자료
시작하세요! C# 10 프로그래밍 - 정성태

profile
Runner's high를 목표로

0개의 댓글