C# 열거형(Enum) 완벽 가이드: 선언, 사용법, 모범 사례
열거형(Enumeration)은 명명된 정수 상수들의 집합입니다. enum 키워드로 선언합니다.
C# 열거형은 값 타입(Value Type)입니다. 자체 값을 가지며, 상속받거나 상속을 전달할 수 없습니다.
enum 변수 선언
enum <enum_이름> { 열거_리스트 };
enum_이름: 열거형 타입 이름
열거_리스트: 쉼표로 구분된 식별자 목록
열거 리스트의 각 심볼은 앞선 심볼보다 1 큰 정수 값을 가집니다. 기본적으로 첫 번째 심볼의 값은 0입니다.
기본 예제
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
값: Sun=0, Mon=1, Tue=2, Wed=3, Thu=4, Fri=5, Sat=6
명시적 값 할당
enum Days { Sun = 1, Mon = 2, Tue = 3, Wed = 4, Thu = 5, Fri = 6, Sat = 7 }
열거형 사용 예제
using System;
namespace EnumApplication
{
class EnumProgram
{
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
static void Main(string[] args)
{
int WeekdayStart = (int)Days.Mon; // 캐스팅으로 정수 값 얻기
int WeekdayEnd = (int)Days.Fri;
Console.WriteLine("Monday: {0}", WeekdayStart); // 1
Console.WriteLine("Friday: {0}", WeekdayEnd); // 5
Console.ReadKey();
}
}
}
열거형의 기반 타입 지정
기본 기반 타입은 int지만, 다른 정수 타입으로 지정 가능합니다.
enum ByteEnum : byte { A = 1, B = 2 }
enum LongEnum : long { Min = -100, Max = 100 }
Flags 열거형 (비트 플래그용)
[Flags] 특성을 사용하면 비트 조합이 가능한 열거형을 만들 수 있습니다.
[Flags]
enum FileAccess
{
None = 0,
Read = 1, // 0001
Write = 2, // 0010
Execute = 4, // 0100
All = Read | Write | Execute // 0111 = 7
}
// 사용
FileAccess access = FileAccess.Read | FileAccess.Write; // 3
bool canRead = (access & FileAccess.Read) != 0; // true
bool canExec = (access & FileAccess.Execute) != 0; // false
유용한 Enum 정적 메서드
| 메서드 | 설명 |
Enum.GetNames(typeof(T)) | 모든 상수 이름을 문자열 배열로 반환 |
Enum.GetValues(typeof(T)) | 모든 상수 값을 배열로 반환 |
Enum.IsDefined(typeof(T), value) | 지정된 값/이름이 열거형에 정의되어 있는지 확인 |
Enum.Parse(typeof(T), "Name") | 문자열을 열거형 값으로 변환 |
Enum.TryParse<T>("Name", out result) | 안전한 파싱 (예외 없이 bool 반환) |
Enum.ToObject(typeof(T), value) | 정수 값을 열거형 타입으로 변환 |
활용 예제
enum Colors { Red, Green, Blue }
// 모든 이름 출력
foreach (string name in Enum.GetNames(typeof(Colors)))
Console.WriteLine(name); // Red, Green, Blue
// 모든 값 출력
foreach (int val in Enum.GetValues(typeof(Colors)))
Console.WriteLine(val); // 0, 1, 2
// 문자열 → Enum 파싱
Colors c = (Colors)Enum.Parse(typeof(Colors), "Green"); // Colors.Green
// 안전한 파싱 (C# 7.0+)
if (Enum.TryParse("Yellow", out Colors result))
Console.WriteLine(result);
else
Console.WriteLine("정의되지 않은 색상");
모범 사례: 열거형 이름은 단수형(예: Day 아닌 Days)으로, [Flags] 열거형은 복수형으로 명명하세요. 기본값 0은 None 또는 의미상 '기본/미지정' 상태에 할당하세요.