F.R.I.D.A.Y.

C# - enum(열거형) 본문

DEV/.Net

C# - enum(열거형)

F.R.I.D.A.Y. 2021. 5. 27. 14:37
반응형

특정 상수를 의미를 가지는 문자열로 표현할 수 있도록 제공하는 문법


열거형

 프로그래밍을 하다보면 특정 값이 들어왔을 때 특정 동작을 수행하는 함수나 객체를 만드는 경우가 허다하다. 이럴 때 특정 작업을 수행하기 위한 입력값이 숫자로 표현되었을 때, 그리고 그런 숫자가 많을 때는 숫자 하나를 잘못 작성해 semantic 오류[# 논리적 오류로, 프로그래밍 문법 자체는 맞지만 기획 의도와 맞지 않는 행동을 수행하는 문제를 시맨틱 에러라고 부른다]를 부른다.

 

위치

 이런 문제는 특정 값이 가지는 의미를 바로 알 수 있도록 하는 것이 문제 해결의 실마리가 될 수 있는데, 이 때 열거형이 큰 도움이 된다. 일단 열거형은 아래와 같은 상황에 선언이 가능하다.

  • 클래스 및 네임스페이스 안쪽
  • 바로 윗 스코프가 메서드, 함수 혹은 프로퍼티가 아닌 경우

 

 즉, 아래 코드에선 class Program 바로 안쪽에 작성하거나 namespace cSharpTest 에서 작성이 가능하다는 말이 되겠다.

namespace cSharpTest
{
    class Program
    {
         public enum Category
        {
            Cake = 0b_0000_0001,
            IceCream,
            Bread
        }
        static void Main(string[] args)
        {
            
        }
    }
}

 

선언

 아래와 같이 선언이 가능하다.

enum Category[ : uint]
{
	C,
    Cpp = 3,
    cSharp = 4
    
}​

 열거형 이름 뒤에는 콜론을 작성한 뒤에 열거형의 자료 범위를 지정할 수 있다.[# enum Category : uint 와 같이 이용가능]

 

사용

 기본적으로 열거형은 상수를 의미를 가진 문자열로 대체하기 위한 문법으로 제공되기 때문에 경우에 따라서는 연산에 사용할 수 있다.

 

 예를 들어서 요즘 나오는 C/C++ 컴파일러[# MS의 MSVC 포함]는 대개 C 컴파일러를 따로 만들지 않고, C++ 컴파일러에서 C 컴파일을 할 때 C 문법만 사용하도록 제한하는 방식으로 컴파일러를 제공한다. 이럴 때 아래처럼 사용할 수 있다.

         enum compiler
        {
            C = 1,
            Cpp = 3,
            cSharp = 4
        }
        
        static void Main(string[] args)
        {
            compiler c = compiler.C;

            int value = (int)c + 2;

            System.Console.WriteLine(value);
        }

 

 

Flags 열거형

 Windows Desktop Programming[# Win32 Programming]을 경험해본 적이 있다면 아래같은 방식으로 코드를 구성한 적을 볼 것이다.

WS_OVERLAPPEDWINDOW & ~(WS_MAXIMIZEBOX)

 

 이런 코드는 열거형 혹은 그에 준하는 것[# 전처리 상수로 만들어졌다던지, 이 코드의 경우엔 전처리 상수로 구성되어 있다.]으로 작성되어 함수나 특정 동작을 수행할 때 옵션으로서 지정될 수 있다.

 

구성 방법

 이러한 값들은 모두 비트 플래그에서 단일 비트만이 1로 활성되 되어 있는 값으로 설정이 된다는 것인데, 아래같은 방식으로 구성이 된다. (2의 제곱수 - 1로만 구성한다)

[Flags]
enum Category{
	a = 1,
    b = 2,
    c = 4,
    d = 8
}

 각 값을 비트 패턴으로 변환하면 모든 비트 중에 하나만 1로 설정되어 있는 것을 알 수 있다.

더보기

# 십진수 말고 이진수로..

 Visual Studio에서는 아래와 같이 다양한 진수형식의 숫자를 지원한다.

0b_0000_1111
15
0x0F

 위에서부터 차례로 2진수, 10진수, 16진수이다. 8진수 접두사는 없는듯.

int value = 0123;

System.Console.WriteLine("{0}", Convert.ToString(value, 10));

 해당 코드로 테스트를 진행해보았으나 8진수가 아니라 10진수 123이 나오게 되었다. 위 0123 상수가 8진수 표현으로 등록이 되었다면 123이 아니라 그보다 낮은 수가 나왔어야하는데 아닌걸 보면 .Net 5에서는 지원하지 않는것일지도

 

추가 기능

 열거형 윗 줄에 [Flags]를 통해 해당 열거형이 플래그 타입으로 구성된다는 것을 알리게 되면 ToString() 메서드를 통해 문자열로 변환했을 때 [Flags]를 작성했을때와는 다르게 동작한다.

 

 일반적인 열거형을 출력하면 숫자가 출력되지만, 만일 [Flags]로 선언을 하게 되면 열거형의 문자열이 나열되어 출력된다.

        [Flags]
         enum compiler
        {
            C = 1,
            Cpp = 2,
            cSharp = 4
        }
        
        static void Main(string[] args)
        {
            compiler c = compiler.C | compiler.Cpp;


            
            System.Console.WriteLine("{0}", c.ToString());
        }
더보기

# 참고 사항

 enum을 Flags로 설정하지 않아도 단일 옵션으로 설정한 경우에는 문자열이 출력된다. 그러나 Flags를 지정하지 않았을 때 위 코드와 같이 여러 옵션을 비트 wise로 묶게 되면 해당하는 숫자가 출력된다.

 

 Flags 지정을 했을 때

 

 Flags 지정을 하지 않았을 때

 

# index

728x90
반응형

'DEV > .Net' 카테고리의 다른 글

C# - 조건문  (0) 2021.05.27
C# - Nullable Type  (0) 2021.05.27
C# - 문자열  (0) 2021.05.27
C# - 변수 선언  (0) 2021.05.27
.Net 프레임워크의 통합  (0) 2021.05.27
Comments