Programing/dotnet core

[dotnetcore] system.flag를 활용한 enum(열거형) 의 사용법

Ezzi 2020. 5. 11. 17:33
반응형

열거형 또는 열거형 형식이라고 불리는 enum은 특정 목록에 대한 조합으로 정의 하여 사용하는 형식입니다. 

 

예를 들어 

 

오늘 모 먹지? 라는 질문에

 

한국요리, 중국요리, 일본요리, 패스트푸드... 등등

 

위와 같이 비슷한 주제에 대한 목록을 묶음으로 정의 해두고 사용하는 형식입니다. 

 

특히 그 목록이 반복적으로 사용되어 질 때 더욱 효과적으로 사용할 수 있습니다. 

 

public enum FoodType
{
    None,
    Korean,
    Chinese,
    Japanese,
    FastFood,
    etc
}

 

기본적으로 위와 같이 정의 했을 때 컴파일러는 각 항목을 int 형으로 인식하게 됩니다. 

 

 

 

 

 

내가 가장 좋아하는 자동차 회사는? 이라는 질문에 답변하는 프로그램을 만든다고 했을 때

 

다음과 같이 코드를 작성해 보겠습니다.

using System;

namespace enumTest
{
    public enum CarCompany
    {
        None,
        Hyundai,
        Kia ,
        SsangYong ,
        BMW ,
        Tesla 
    }

    public class Program
    {
        static void Main(string[] args)
        {
            CarCompany temp = CarCompany.Hyundai;
            Console.WriteLine(temp + " int : " + (int)temp);
        }
    }
}

다음과 같이 출력이 되었습니다.

 

 

[System.Flags] 키워드

 

만약 한 회사가 아니라 여러회사를 좋아하는 사람이면 어떻게 할 수 있을까요?

 

system.flag 키워드를 붙이면 여러 개의 선택을 하나의 값으로 조합할 수 있습니다.

 

using System;

namespace enumTest
{
    [System.Flags]
    public enum CarCompany : byte
    {
        None,
        Hyundai = 1,
        Kia = 1 << 1,
        SsangYong = 1 << 2,
        BMW = 1 << 3,
        Tesla = 1 << 4 
    }

    public class Program
    {
        static void Main(string[] args)
        {
            CarCompany temp = CarCompany.Hyundai | CarCompany.Tesla;
            Console.WriteLine(temp + " byte : " + (byte)temp);
        }
    }
}

 

결과는 다음과 같이 출력이 됩니다.

 

 

! 저장할 옵션(목록)의 개수에 따라서 효율적인 코드 작성을 위해서 다음과 같은 사용을 권장한다.

8개 =  byte 상속

16개 = short

32개 = int 

64개 = long

 

 

<< 쉬프트 연산자

1은 2진법으로 0001 입니다. 

0001을 1만큼 << 쉬프트 하게 되면 

0010 이 되기 때문에 2가 됩니다.

 

 

따라서 위의 코드에서 CarCompany를 쉬프트 연산자로 정의한 내용은 다음과 같습니다. 

None = 0,
Hyundai =  1
Kia = 2
SsangYong = 4
BMW = 8
Tesla = 16

 

 

 

출력결과가 다음과 같이 나온 이유는

현대와 테슬라를  비트 연산 | 했기 때문에 17이 나오게 된 것입니다. 

 

 

 

 

 

 

 

 

 

 

반응형