숏컷 코드
string label = state switch
{
GameState.Ready => "준비",
GameState.Playing => "진행 중",
GameState.Paused => "일시정지",
GameState.Over => "게임 오버",
_ => throw new ArgumentOutOfRangeException(nameof(state))
};문법
어떤 분기 형태가 있나
값 분기 카드는 아래 세 가지를 같이 보면 빠르게 정리됩니다.
// 값 매핑
label = state switch { GameState.Ready => "준비", _ => "기타" };
// 범위 분기
tier = score switch { >= 90 => "A", _ => "B" };
// 타입 / 프로퍼티 패턴
text = shape switch { Circle { Radius: > 10 } => "큰 원", _ => "기타" };- 단순 값 매핑
- 범위 비교
- 타입/프로퍼티 패턴과 결합
switch statement vs switch expression
switch statement는 실행 흐름을 분기하고, switch expression은 값을 생산합니다. 둘의 핵심 차이는 결과가 있느냐 없느냐입니다.
// switch statement — 각 case가 동작을 실행
switch (direction)
{
case Direction.North: MoveUp(); break;
case Direction.South: MoveDown(); break;
}
// switch expression — 분기의 결과가 값으로 평가됨
Vector2 delta = direction switch
{
Direction.North => new Vector2(0, 1),
Direction.South => new Vector2(0, -1),
Direction.East => new Vector2(1, 0),
Direction.West => new Vector2(-1, 0),
_ => Vector2.zero
};값 선택이 목적이라면 switch expression이 훨씬 간결하고 의도가 분명합니다. 반면 case마다 여러 줄의 절차가 필요하다면 switch statement가 더 자연스럽습니다.
완전성 검사 (exhaustiveness)
컴파일러는 switch expression이 모든 경우를 다루는지 확인합니다. 다루지 않은 경우가 있으면 경고나 런타임 SwitchExpressionException이 발생합니다. _ 기본 패턴으로 명시적으로 처리하거나, 처리할 수 없는 값은 예외를 던지도록 설계하세요.
// 미처 처리하지 않은 enum 값이 추가되면 즉시 발견 가능
_ => throw new ArgumentOutOfRangeException($"처리되지 않은 값: {state}")// ❌ 기본 arm이 없으면 새 enum 값 추가 때 런타임 실패 가능
string label = state switch
{
GameState.Ready => "준비"
};when 가드 — 추가 조건 붙이기
패턴과 함께 when 절을 쓰면 단순한 값 비교를 넘어 복합 조건으로 분기할 수 있습니다.
string tier = score switch
{
>= 2000 => "다이아",
>= 1000 and < 2000 => "골드",
>= 500 => "실버",
int s when s < 0 => throw new ArgumentException("음수 점수"),
_ => "브론즈"
};패턴 매칭과의 결합
switch expression은 타입 패턴, 프로퍼티 패턴과 결합하면 if-else 체인보다 훨씬 간결해집니다.
string Describe(object shape) => shape switch
{
Circle { Radius: > 10 } => "큰 원",
Circle => "작은 원",
Rectangle { Width: var w, Height: var h } when w == h => "정사각형",
Rectangle => "직사각형",
null => "null",
_ => "알 수 없음"
};체크포인트
| 기준 | switch statement | switch expression |
|---|---|---|
| 목적 | 실행 흐름 분기 | 값 반환 |
| 형태 | case X: ...; break; | X => value, |
| 완전성 검사 | 없음 | 컴파일러가 경고 |
| 패턴 지원 | 제한적 | 풍부 |
| 적합한 상황 | 각 분기에 절차가 많을 때 | 값 선택, 변환 |
주의할 점
모든 경우를 다루지 않고 _ 기본 패턴도 없으면, 예상치 못한 값이 들어올 때 런타임에 SwitchExpressionException이 발생합니다. 처리 불가 케이스는 조용히 넘기는 대신 예외를 던져 명시적으로 문제를 드러내는 편이 디버깅에 훨씬 유리합니다.
switch expression은 값을 반환해야 하므로 각 arm이 같은 타입(또는 공통 기반 타입)을 반환해야 합니다. 타입이 다르면 컴파일 오류가 납니다.
참고 링크
2 sources