정리가 필요한 카테고리(추후 정리)/C#,Unity

C#] 열거형(Enum Type)

TwinParadox 2017. 1. 23. 00:00
728x90

### 열거형(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 연산자들과 산술 연산자, 비교 연산자들은 바탕 정수 값들에 대한 연산 결과를 돌려줌.

열거형과 정수 형식의 덧셈은 허용되나, 두 열거형의 덧셈은 허용하지 않음.

728x90

'정리가 필요한 카테고리(추후 정리) > 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