열거형 19개
19.1 일반
열거형 형식은 명명된 상수 집합을 선언하는 고유 값 형식(§8.3)입니다.
예: 예제
enum Color { Red, Green, Blue }
는 멤버
Green
Red
와 함께 명명된Color
열거형 형식을 선언합니다Blue
.끝 예제
19.2 열거형 선언
열거형 선언은 새 열거형 형식을 선언합니다. 열거형 선언은 키워드 enum
로 시작하고 열거형의 이름, 접근성, 기본 형식 및 멤버를 정의합니다.
enum_declaration
: attributes? enum_modifier* 'enum' identifier enum_base? enum_body ';'?
;
enum_base
: ':' integral_type
| ':' integral_type_name
;
integral_type_name
: type_name // Shall resolve to an integral type other than char
;
enum_body
: '{' enum_member_declarations? '}'
| '{' enum_member_declarations ',' '}'
;
각 열거형 형식에는 열거형 형식의 기본 형식이라고 하는 해당 정수 계열 형식 이 있습니다. 이 기본 형식은 열거형에 정의된 모든 열거자 값을 나타낼 수 있어야 합니다. enum_base 있으면 기본 형식을 명시적으로 선언합니다. 기본 형식은 을 제외한 정수 계열 형식 (§8.3.6) char
중 하나여야 합니다. 기본 형식 integral_type
은 (§8.3.5) 또는 integral_type_name
. using integral_type_name
지시문(§14.5)을 고려하는 것을 포함하여 (§7.8.1)과 동일한 방식으로 type_name
해결됩니다.
참고: 형식은
char
키워드 또는 를 통해integral_type_name
기본 형식으로 사용할 수 없습니다. 끝 메모
내부 형식을 명시적으로 선언하지 않는 열거형 선언에는 기본 형식이 int
있습니다.
예: 예제
enum Color : long { Red, Green, Blue }
는 기본 형식
long
의 열거형을 선언합니다.끝 예제
참고: 개발자는 예제와 같이 기본 형식
long
을 사용하여 범위에long
있지만 범위int
가 아닌 값을 사용하도록 설정하거나 나중에 이 옵션을 유지하도록 선택할 수 있습니다. 끝 메모
참고: C#에서는 array_initializer 쉼표(§17.7)를 허용하는 것처럼 enum_body 후행 쉼표가 허용됩니다. 끝 메모
열거형 선언에는 형식 매개 변수 목록을 포함할 수 없지만, 제네릭 클래스 선언 또는 제네릭 구조체 선언 내에 중첩된 열거형은 제네릭 열거형 선언이므로 포함된 형식에 대한 형식 인수는 생성된 형식(§8.4)을 만들도록 제공해야 합니다.
19.3 열거형 한정자
enum_declaration 필요에 따라 열거형 한정자 시퀀스를 포함할 수 있습니다.
enum_modifier
: 'new'
| 'public'
| 'protected'
| 'internal'
| 'private'
;
동일한 한정자가 열거형 선언에 여러 번 표시되는 것은 컴파일 시간 오류입니다.
열거형 선언의 한정자는 클래스 선언(§15.2.2)과 동일한 의미를 갖습니다. 그러나 abstract
열거형 선언에는 , 및 static
sealed
한정자가 허용되지 않습니다. 열거형은 추상적일 수 없으며 파생을 허용하지 않습니다.
19.4 열거형 멤버
열거형 형식 선언의 본문은 열거형 형식의 명명된 상수인 0개 이상의 열거형 멤버를 정의합니다. 두 열거형 멤버는 같은 이름을 가질 수 없습니다.
enum_member_declarations
: enum_member_declaration (',' enum_member_declaration)*
;
enum_member_declaration
: attributes? identifier ('=' constant_expression)?
;
각 열거형 멤버에는 연결된 상수 값이 있습니다. 이 값의 형식은 포함하는 열거형의 기본 형식입니다. 각 열거형 멤버의 상수 값은 열거형의 기본 형식 범위에 있어야 합니다.
예: 예제
enum Color: uint { Red = -1, Green = -2, Blue = -3 }
상수 값
-1
-2
-3
이 내부 정수 형식uint
의 범위에 없기 때문에 컴파일 시간 오류가 발생합니다.끝 예제
여러 열거형 멤버는 동일한 연결된 값을 공유할 수 있습니다.
예: 예제
enum Color { Red, Green, Blue, Max = Blue }
는 두 열거형 멤버
Blue
와Max
연결된 값이 같은 열거형을 표시합니다.끝 예제
열거형 멤버의 연결된 값은 암시적 또는 명시적으로 할당됩니다. 열거형 멤버 의 선언에 constant_expression 이니셜라이저가 있는 경우 열거형의 내부 형식으로 암시적으로 변환된 해당 상수 식의 값은 열거형 멤버의 연결된 값입니다. 열거형 멤버의 선언에 이니셜라이저가 없으면 다음과 같이 연결된 값이 암시적으로 설정됩니다.
- 열거형 멤버가 열거형 형식에서 선언된 첫 번째 열거형 멤버인 경우 연결된 값은 0입니다.
- 그렇지 않은 경우 열거형 멤버의 연결된 값은 텍스트 앞에 오는 열거형 멤버의 연결된 값을 1씩 늘려 가져옵니다. 이 증가된 값은 기본 형식으로 나타낼 수 있는 값 범위 내에 있어야 합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다.
예: 예제
enum Color { Red, Green = 10, Blue } class Test { static void Main() { Console.WriteLine(StringFromColor(Color.Red)); Console.WriteLine(StringFromColor(Color.Green)); Console.WriteLine(StringFromColor(Color.Blue)); } static string StringFromColor(Color c) { switch (c) { case Color.Red: return $"Red = {(int) c}"; case Color.Green: return $"Green = {(int) c}"; case Color.Blue: return $"Blue = {(int) c}"; default: return "Invalid color"; } } }
는 열거형 멤버 이름과 연결된 값을 출력합니다. 출력은 다음과 같습니다.
Red = 0 Green = 10 Blue = 11
다음과 같은 이유로 다음을 수행합니다.
- 열거형 멤버는 이니셜라이저가 없고 첫 번째 열거형 멤버
Red
이므로 값 0이 자동으로 할당됩니다.- 열거형 멤버
Green
에는 명시적으로 값10
이 지정됩니다.- 열거형 멤버
Blue
는 텍스트로 앞에 오는 멤버보다 큰 값을 자동으로 할당합니다.끝 예제
열거형 멤버의 관련 값은 직접 또는 간접적으로 연결된 열거형 멤버의 값을 사용하지 않습니다. 이 순환 제한 이외에 열거형 멤버 이니셜라이저는 텍스트 위치에 관계없이 다른 열거형 멤버 이니셜라이저를 자유롭게 참조할 수 있습니다. 열거형 멤버 이니셜라이저 내에서 다른 열거형 멤버의 값은 항상 기본 형식의 형식을 갖는 것으로 처리되므로 다른 열거형 멤버를 참조할 때 캐스트가 필요하지 않습니다.
예: 예제
enum Circular { A = B, B }
는 선언이 순환이므로 컴파일 시간 오류가 발생합니다
A
B
.A
는 명시적으로 의존B
하며B
암시적으로 의존A
합니다.끝 예제
열거형 멤버는 클래스 내의 필드와 정확히 유사한 방식으로 명명되고 범위가 지정됩니다. 열거형 멤버의 범위는 포함하는 열거형 형식의 본문입니다. 해당 범위 내에서 열거형 멤버는 단순 이름으로 참조할 수 있습니다. 다른 모든 코드에서 열거형 멤버의 이름은 열거형 형식의 이름으로 한정되어야 합니다. 열거형 멤버에는 선언된 접근성이 없습니다. 포함된 열거형 형식에 액세스할 수 있는 경우 열거형 멤버에 액세스할 수 있습니다.
19.5 System.Enum 형식
형식 System.Enum
은 모든 열거형 형식의 추상 기본 클래스이며(이 클래스는 열거형 형식의 기본 형식과 다르며), 상속된 System.Enum
멤버는 모든 열거형 형식에서 사용할 수 있습니다. boxing 변환(§10.2.9)은 열거형 형식에서 모든 열거형 형식으로 System.Enum
존재하며 unboxing 변환(§10.3.7)이 모든 열거형 형식으로 System.Enum
존재합니다.
그 System.Enum
자체가 enum_type 아닙니다. 오히려 모든 enum_type 파생되는 class_type. 형식 System.Enum
은 형식 System.ValueType
(§8.3.2)에서 상속되며, 형식에서 object
상속됩니다. 런타임에 형식 값은 열거형 형식 System.Enum
의 boxed 값에 대한 참조일 null
수 있습니다.
19.6 열거형 값 및 작업
각 열거형 형식은 고유 형식을 정의합니다. 열거형 형식과 정수 형식 간 또는 두 열거형 형식 간에 변환하려면 명시적 열거형 변환(§10.3.3)이 필요합니다. 열거형 형식의 값 집합은 기본 형식의 값 집합과 동일하며 명명된 상수의 값으로 제한되지 않습니다. 열거형의 기본 형식 값은 열거형 형식으로 캐스팅할 수 있으며 해당 열거형 형식의 고유한 유효한 값입니다.
열거형 멤버는 포함하는 열거형 형식의 형식을 갖습니다(다른 열거형 멤버 이니셜라이저 내 제외: §19.4 참조). 연결된 값을 사용하여 열거형 형식 E
으로 선언된 열거형 멤버의 값 v
입니다 (E)v
.
다음 연산자는 열거형 형식의 값에 사용할 수 있습니다.
==
,!=
,<
,>
,<=
>=
(§12.12.6)- binary
+
(§12.10.5) - binary
-
(§12.10.6) ^
,&
|
(§12.13.3)~
(§12.9.5)++
,--
(§12.8.15 및 §12.9.6)sizeof
(§23.6.9)
모든 열거형 형식은 클래스 System.Enum
에서 자동으로 파생됩니다(차례로 파생 System.ValueType
및 object
파생). 따라서 이 클래스의 상속된 메서드와 속성을 열거형 형식의 값에 사용할 수 있습니다.
ECMA C# draft specification