일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Visual Studio
- 이지스퍼블리싱
- 알고리즘
- Javascript
- Tips강좌
- 김성엽
- 지식나눔강좌
- c++
- 백준
- Direct2D
- doit코틀린프로그래밍
- VS ERROR
- 프로그래밍
- Programming
- 리뷰
- 함수
- Desktop
- Win32
- Windows
- Tips프로그래밍강좌
- 포인터
- 연산자
- Kotlin
- 티스토리
- 문법
- tipssoft
- c#
- c
- 배열
- CS
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
C# - enum(열거형) 본문
특정 상수를 의미를 가지는 문자열로 표현할 수 있도록 제공하는 문법
열거형
프로그래밍을 하다보면 특정 값이 들어왔을 때 특정 동작을 수행하는 함수나 객체를 만드는 경우가 허다하다. 이럴 때 특정 작업을 수행하기 위한 입력값이 숫자로 표현되었을 때, 그리고 그런 숫자가 많을 때는 숫자 하나를 잘못 작성해 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
'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 |