[C# NuGet] C# SmartEnum 이란?

참조


SmartEnum 이란?

  • SmartEnum 은 C# enum에 대한 형식 안전 객체 지향 대안의 구현입니다.

SmartEnum 설치

  • C# 프로젝트에서 SmartEnum 을 설치하려면 NuGet Package를 설치하면 됩니다.
Install-Package Ardalis.SmartEnum


SmartEnum 사용법

  • SmartEnum에서 상속하여 스마트 열거를 정의합니다.여기서 Tenum은 선언할 유형입니다
using Ardalis.SmartEnum;

public sealed class TestEnum : SmartEnum<TestEnum>
{
    public static readonly TestEnum One = new TestEnum(nameof(One), 1);
    public static readonly TestEnum Two = new TestEnum(nameof(Two), 2);
    public static readonly TestEnum Three = new TestEnum(nameof(Three), 3);

    private TestEnum(string name, int value) : base(name, value)
    {
    }
}

  • 기본값 유형은 int이지만 두 번째 일반 인수 TValue를 사용하여 설정할 수 있습니다.
  • 문자열 별칭을 명시적으로 설정할 수도 있습니다. (여기서 공백이 허용됩니다.)

using Ardalis.SmartEnum;

public sealed class TestEnum : SmartEnum<TestEnum, ushort>
{
    public static readonly TestEnum One = new TestEnum("A string!", 1);
    public static readonly TestEnum Two = new TestEnum("Another string!", 2);
    public static readonly TestEnum Three = new TestEnum("Yet another string!", 3);

    private TestEnum(string name, ushort value) : base(name, value)
    {
    }
}

  • 일반 열거형과 마찬가지로 동일한 값에 두 개 이상의 문자열을 할당할 수 있지만 문자열에는 하나의 값만 할당할 수 있습니다.
using Ardalis.SmartEnum;

public sealed class TestEnum : SmartEnum<TestEnum>
{
    public static readonly TestEnum One = new TestEnum(nameof(One), 1);
    public static readonly TestEnum Two = new TestEnum(nameof(Two), 2);
    public static readonly TestEnum Three = new TestEnum(nameof(Three), 3);
    public static readonly TestEnum AnotherThree = new TestEnum(nameof(AnotherThree), 3);
    // public static TestEnum Three = new TestEnum(nameof(Three), 4); -> throws exception

    private TestEnum(string name, int value) : base(name, value)
    {
    }
}

SmartEnum 사용 예제

  • 그럼 실제 위의 내용을 토대로 SmartEnum을 사용한 예제코드를 작성해 보도록 하겠습니다.
using Ardalis.SmartEnum;
using System;

namespace interfaceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // FruitEnum List 출력하기
            foreach (var fruit in FruitEnum.List)
            {
                Console.WriteLine($"{fruit}");
            }

            // Enum Count 구하기
            int count = FruitEnum.List.Count;
            Console.WriteLine($"FruitEnum Count : {count} 개 입니다.");

            // Name 속성과 문자열 접근하기
            var myEnum = FruitEnum.FromName("Mango");
            Console.WriteLine($"FromName : {myEnum}");

            // Enum 존재 유무
            if(FruitEnum.TryFromName("Orange", out var outEnum))
            {
                Console.WriteLine($"FromName : {outEnum}");
            }
            else
            {
                Console.WriteLine($"없는 Name입니다.");
            }

            // 값을 일치시켜 열거형 객체에 접근하기
            var myEnumValue = FruitEnum.FromValue(3);
            Console.WriteLine($"FromValue : {myEnumValue}");

            // ToString() 메서드
            Console.WriteLine($"{FruitEnum.Apple}");
            Console.WriteLine($"{FruitEnum.Tomato}");
            Console.WriteLine($"{FruitEnum.Mango}");

            // Switch 문
            FruitEnum fruitEnum = FruitEnum.Mango;
            switch (fruitEnum.Name)
            {
                case nameof(FruitEnum.Apple):
                    Console.WriteLine("나는 사과");
                    break;
                case nameof(FruitEnum.Orange):
                    Console.WriteLine("나는 오렌지");
                    break;
                case nameof(FruitEnum.Tomato):
                    Console.WriteLine("나는 토마토");
                    break;
                case nameof(FruitEnum.Mango):
                    Console.WriteLine("나는 망고");
                    break;
                default:
                    Console.WriteLine("모르는 과일입니다.");
                    break;
            }

            // Switcha 문 패턴일치 사용
            switch(fruitEnum)
            {
                case var e when e.Equals(FruitEnum.Apple):
                    Console.WriteLine("나는 사과");
                    break;
                case var e when e.Equals(FruitEnum.Orange):
                    Console.WriteLine("나는 오렌지");
                    break;
                case var e when e.Equals(FruitEnum.Tomato):
                    Console.WriteLine("나는 토마토");
                    break;
                case var e when e.Equals(FruitEnum.Mango):
                    Console.WriteLine("나는 망고");
                    break;
            }
        }
    }

    public sealed class FruitEnum : SmartEnum<FruitEnum>
    {
        public static readonly FruitEnum Apple = new(nameof(Apple), 1);
        public static readonly FruitEnum Orange = new(nameof(Orange), 2);
        public static readonly FruitEnum Tomato = new(nameof(Tomato), 3);
        public static readonly FruitEnum Mango = new(nameof(Mango), 3);

        private FruitEnum(string name, int value) : base(name, value)
        {
        }
    }
}

실행 결과

  • SmartEnum 을 이용하면 보다 유연하고 더 다양한 방법으로 Enum 을 사용할 수 있습니다.
  • 이 외에도, 많은 기능들을 제공하기 때문에 필요에 따라서 직접 찾아서 활용하시면 되겠습니다.
    Apple
    Mango
    Orange
    Tomato
    FruitEnum Count : 4 개 입니다.
    FromName : Mango
    FromName : Orange
    FromValue : Mango
    Apple
    Tomato
    Mango
    나는 망고
    나는 토마토
728x90

이 글을 공유하기

댓글(8)

  • 질문
    2022.01.16 00:44

    본문 글과는 무관한데 혹시 C# 취업에 관해 여쭤봐도 될까요?

    • 2022.01.16 06:59 신고

      아는 선에서 알려드리겠습니다~!

    • 2022.01.16 15:10

      감사합니다.
      현재 C#으로 취업을 생각중입니다. C# 관련 기술(WPF, ASP.NET CORE)을 목표로 하고 있습니다.

      아직 취업시장에 발을 들여본 적이 없어서 국내에는 C# 어떤 분야에 사용되는지 궁금합니다.
      예를 들어 WPF는 키오스크 분야에 사용된며 또 어떤 분야가 있는지 궁금합니다.

      한가지 더 궁금한 점은 국내에서 C#이 스마트 팩토리에 많이 사용되던데 개발이 목적이면 이쪽 분야는 피해야 할까요? FA/MES 개발자가 winform/devExpress 정도만 사용하고 출장이 엄청 많다고 얘기를 들었습니다.

    • 2022.01.16 15:58 신고

      음..외국에 비해 우리나라에서 C#은 대부분 FA 쪽에서 많이 사용하는 건 사실입니다..!

      저 또한 현재 SmartFactory 쪽 솔루션 회사에 다니고 있습니다.

      FA 쪽이 출장이 많은 것도 사실입니다. 개발을 하고 개발된 프로그램을 고객사(삼성전자, SK하이닉스, 중국 BOE 등등) 에게 납품을 하고 유지보수를 해야 하기 때문에 국내외 출장도 다른 업종에 비해 잦은것도 사실입니다.

      때문에, 내가 목표하는게 오직 개발에만 전념하고 싶고, 고객대응 및 유지보수는 피하고 싶다면 순수 소프트웨어쪽 회사를 찾아 보는게 나을 것 같습니다.

      그렇다고 FA가 개발자의 무덤? 이라고 한다면 꼭 그렇다고 생각하지는 않습니다. FA쪽 개발을 하면서 장비와의 통신, 반도체, 디스플레이 등과 같은 개발 외 적으로 새로운 개념들을 학습하면서 또 다른 다양성 및 전문성 등을 경험도 할 수 있습니다. (물론 이건 회사마다 케바케입니다.)

      FA쪽 경험하면서 우리가 아는 네이버, 카카오, 엔씨소프트, 넥슨 등과 같은 대기업으로 이직하는 경우도 많기 때문에 결국은 본인 하기 나름이라고 생각이 듭니다.

      그리고 WPF는 키오스크 분야 말고 어떤 분야가 있는지 궁금하다고 하였는데요. 윈도우 SW 쪽에서는 WPF나 Winform 수요는 계속 있다고 보시면 됩니다.

      C#으로 FA 시장을 피하고 싶다면, Unity를 학습하여 게임쪽 시장 혹은 의료 소프트웨어를 만드는 쪽에서도 C#을 자주 사용하는 걸로 알고 있어서 이쪽 계열도 찾아보시는 걸 추천 드립니다~!

      다만, 개발자는 꼭 하나의 언어로 국한되는게 아니라, 다양한 경험 및 공부를 통해 처음엔 FA로 시작했다가 게임쪽 혹은 B2C 기업으로 이직해서 순수소프트웨어 쪽으로 언제든 이직할 수 있는 직업이라 생각이 들기 때문에, 결국은 꾸준한 자기계발이 답이라 생각합니다.

      또 궁금한거는 언제든 질문 남겨주세요ㅎㅎ

    • 2022.01.16 18:01

      질문이 조금 두리뭉실했는데 상세히 적어주셔서 감사합니다.

      FA에 대해서 안좋게 생각하고 있었는데 알려주신 부분을 듣고보니 회사의 케바케가 조금 중요하게 느껴집니다.

      FA에 관심이 없었던 건 아니지만 출장이 잦은 부분이 조금 크리티컬하게 다가와 FA는 제외해야겠네요.

      처음엔 asp.net core 웹을 목표로 하고있었는데 국내 웹은 자바/스프링을 제외하곤 스타트업에서 간혹 .net core가 보이더라구요.

      차라리 자바/스프링을 하면 되는건데 처음에 C#을 접하고 자바를 접해본 케이스입니다.
      개발환경의 차이가 엄청 차이가 나더라구요.
      이러면 안되지만 C# 비주얼 스튜디오 쓰다 자바 이클립스/인텔리제이 환경이 불편하고 아직 많이 모르지만 언어의 매력과 편의성 이랄까요 C#이 더 좋게 느껴졌습니다.

      그리고 답변해주신 글이 생각정리에 많이 도움 됐습니다.
      WPF 소프트웨어로 시작 후 asp.net core 등 차근차근히 폭을 넓혀가야겠습니다!

      감사합니다~

    • 2022.01.16 18:15 신고

      화이팅 입니다!ㅎㅎ

    • 2022.01.17 10:46

      C#이 왜 FA만 사용하는건가요? 그리고 FA나 장비회사여두 규모가 큰기업(몇개 없지만)은 개발부서와 CS 부서가 나누어져 있어 출장이 잦지 않습니다. 또한 Window Application이든 Asp.net 이든 여러분야에서 많이 사용됩니다. ASP.net (Core든 Framework) 와 Vue, React, Angular 등의 웹개발 쪽을 공부한다면 분야에 국한되지 않고 회사를 찾을 수 있습니다. WPF를 공부했다면 Angular를 공부하는 것을 추천합니다. 구조가 가장 유사하여 빠르게 구조를 이해할 수 있습니다.

  • 조조범범
    2022.01.17 10:25

    2022.01.17 출석체크요.

Designed by JB FACTORY