### 열거형(Enum Type)
일련의 수치 상수들에 이름을 붙일 수 있는 특별한 형식
열거형의 각 멤버에는 바탕 정수값이 존재하며, 이는 기본적으로 int형이며, 선언 순서대로 0, 1, 2가 배정됨.
int 외의 형식을 배정하는 것도 가능하며, 명시적으로 바탕 정수 값 외의 값을 배정하는 것도 가능함.
더 나아가, 컴파일러는 열거형의 일부 멤버들에만 명시적으로 값을 배정하는 것도 허용함.
이 경우 배정되지 않은 열거형 멤버들에게는 가장 최근 명시적으로 배정된 값을 차례로 증가한 값들이 배정됨.
## 변환
enum 인스턴스를 그 바탕 정수값으로, 그 반대로 변환 가능함.
두 경우 모두 명시적 캐스팅(casting)이 필요.
public enum BorderSide : byte { Left = 1, Right, Top=10, Bottom=11 } int i = (int) BorderSide.Left; BorderSide side = (BorderSide) i; bool leftOrRight= (int) side <= 2;
한 열거형을 다른 열거형으로 변환도 가능하며, 이 역시 명시적 캐스팅이 필요함.
public enum HorizontalAlignment { Left = BorderSide.Left, Right = BorderSide.Right, Center } HorizontalAlignment h = (HorizontalAlignment) BorderSide.Right; HorizontalAlignment h = (HorizontalAlignment) (int) BorderSide.Right;
컴파일러는 enum 인스턴스가 관여하는 표현식에 있는 수치 리터럴 0을 특별히 취급함.
다음 예시에서 리터럴 0은 명시적 캐스팅 없이도 열거형으로 변환됨.
Borderside b = 0; // 캐스팅 필요 없음 if (b==0) { /*...*/ }
이와 같은 일이 발생하는 이유는,
열거형의 첫 멤버가 기본값으로 쓰이는 경우가 많고,
조합된 열거형에서 0은 아무 플래그도 없음을 뜻함.
##Flags 열거형
열거형의 멤버들을 조합해 사용할 수 있음.
이 때 중의성(ambiguity)이 발생하지 않게 하려면, 조합 가능한 열거형 멤버들에 값들을 명시적으로 배정할 필요가 있으며, 흔히 2의 거듭제곱수를 배정함.
조합된 열거형 값들을 다룰 때에는 |나 &같은 bitwise 연산자를 사용함.
이들은 열거형 인스턴스의 바탕 정수 값들에 대해 작용함.
[Flags] public enum BorderSides { None=0, Left=1, Right=2, Top=4, Bottom=8 } BorderSides leftRight=BorderSides.Left | BorderSides.Right; if ((leftRight & BorderSides.Left) != 0) Console.WriteLine("Left 포함"); string formatted = leftRight.ToString(); BorderSides s = BorderSides.Left; s |= BorderSides.Right; Console.WriteLine(s==leftRight); // True s ^= BorderSides.Right; Console.WriteLine(s); // Left
멤버들을 조합할 수 있는 열거형에는 항상 Flags 특성을 붙이는 것이 관례.
또한, 조합 가능한 열거형 이름으로는 단수형이 아닌 복수형 사용이 관례.
Flags 특성을 붙이지 않은 enum의 멤버들도 조합할 수 있으나, 그런 enum의 인스턴스에 ToString을 호출하면 이름들의 목록이 아닌 바탕 수치가 반환됨.
편의를 위해서 열거형 선언 자체에서 멤버들을 조합해 사용 가능함.
[Flags] public enum BorderSides { None=0, Left=1, Right=2, Top=4, Bottom=8, LeftRight=Left | Right, TopBottom=Top | Bottom, All=LeftRight | TopBottom }
##열거형이 지원하는 연산자
= == != < > <= >= + - ^ & | ~ += -= ++ -- sizeof
bitwise 연산자들과 산술 연산자, 비교 연산자들은 바탕 정수 값들에 대한 연산 결과를 돌려줌.
열거형과 정수 형식의 덧셈은 허용되나, 두 열거형의 덧셈은 허용하지 않음.
'정리가 필요한 카테고리(추후 정리) > C#,Unity' 카테고리의 다른 글
C#] 구조체(Structure) (0) | 2017.01.27 |
---|---|
C#] 제네릭(Generic) - 1 (0) | 2017.01.24 |
C#] 부분 형식, 부분 메서드 (0) | 2017.01.18 |
C#] nameof (0) | 2017.01.17 |
C#] 상수(Constant) (0) | 2017.01.15 |