숏컷 코드
public enum GameState
{
Idle, // 0
Playing, // 1
Paused, // 2
GameOver // 3
}
GameState state = GameState.Playing;
string label = state switch
{
GameState.Playing => "진행 중",
GameState.Paused => "일시정지",
GameState.GameOver => "종료",
_ => "대기"
};문법
enum은 정수의 이름 붙은 집합
내부적으로 int(기본)로 저장됩니다. 명시하지 않으면 첫 값이 0이고 이후 1씩 증가합니다. 기반 타입을 바꾸거나 값을 직접 지정할 수 있습니다.
public enum Priority : byte // 기반 타입을 byte로 변경
{
Low = 1,
Medium = 5,
High = 10
}숫자보다 이름으로 의미를 드러낼 수 있지만, 정의에 없는 숫자를 캐스팅하면 enum 변수에도 들어갈 수 있으므로 외부 입력값은 반드시 유효성을 검사해야 합니다.
[Flags] — 비트 플래그로 조합 표현
여러 상태가 동시에 활성화될 수 있는 경우, 2의 거듭제곱 값을 쓰고 [Flags]를 붙이면 |로 조합하고 HasFlag로 확인할 수 있습니다.
[Flags]
public enum Permission
{
None = 0,
Read = 1, // 0001
Write = 2, // 0010
Delete = 4, // 0100
All = Read | Write | Delete
}
Permission p = Permission.Read | Permission.Write;
bool canRead = p.HasFlag(Permission.Read); // true
bool canDelete = p.HasFlag(Permission.Delete); // false
p |= Permission.Delete; // Delete 추가
p &= ~Permission.Write; // Write 제거문자열·정수 변환
// int → enum (캐스팅)
GameState state = (GameState)2; // Paused
// enum → int
int value = (int)GameState.Playing; // 1
// string → enum (실패 시 예외)
GameState s1 = Enum.Parse<GameState>("Playing");
// string → enum (실패 시 false 반환)
if (Enum.TryParse<GameState>("Unknown", out GameState result))
{
// ...
}
// enum → string
string name = GameState.Playing.ToString(); // "Playing"switch expression과의 결합
enum은 switch expression과 특히 잘 맞습니다. 컴파일러가 모든 케이스를 다뤘는지 확인해 주기 때문에, 새 값이 추가됐을 때 처리 누락을 컴파일 시점에 발견할 수 있습니다.
체크포인트
| 상황 | 방법 |
|---|---|
| 단일 상태 표현 | 일반 enum |
| 여러 상태 동시 표현 | [Flags] + 2의 거듭제곱 값 |
| 안전한 문자열 파싱 | Enum.TryParse<T>() |
| 외부 정수 값 → enum | (EnumType)value + Enum.IsDefined() 검증 |
| 다중 분기 처리 | switch expression |
주의할 점
(GameState)99처럼 정의되지 않은 정수를 캐스팅해도 컴파일·런타임 오류가 나지 않습니다. 외부에서 들어온 정수를 enum으로 변환할 때는 Enum.IsDefined()나 Enum.TryParse()로 유효성을 먼저 검사하는 편이 안전합니다.
[Flags] enum에서 값이 2의 거듭제곱이 아니면 HasFlag와 비트 연산이 예상과 다르게 동작합니다. 조합 값(All = Read | Write | Delete)은 괜찮지만, 개별 플래그 값은 반드시 겹치지 않는 비트를 사용해야 합니다.
참고 링크
2 sources