C# Switch 식(Expression)
C# 8.0(2019년 9월)부터 도입된 Switch 식(Switch Expression)은 기존의 switch-case 문을 획기적으로 줄여주는 강력한 기능
람다 표현식(=>)을 쓰는 것처럼 간결하고 직관적인 분기 처리가 가능
기존 방식 (Statement)
public string GetGrade(int score)
{
string grade;
switch (score)
{
case 90:
grade = "A";
break;
case 80:
grade = "B";
break;
default:
grade = "C";
break;
}
return grade;
}
새로운 방식 (Expression)
public string GetGrade(int score) => score switch
{
90 => "A",
80 => "B",
_ => "C"
};
또는 다른 범위 방식으로 (결과는 다름)
score switch
{
>= 90 => "A",
>= 80 => "B",
>= 70 => "C",
_ => "D"
};
- 위치 이동:
switch키워드가 변수 뒤로 이동 (score switch) - 화살표 사용:
case ... :대신 람다 화살표=>를 사용 - Default 처리:
default:대신 와일드카드_를 사용 - 식(Expression): 그 자체가 ‘값’을 반환하므로 메서드의 리턴값으로 바로 사용할 수 있음
강력한 활용 패턴
C# 9.0(2020년 11월)부터 Switch 식이 단순 매핑이 아니라 패턴 매칭(Pattern Matching)과 결합됨
- Switch Expression 자체는 C# 8에서 처음 도입
- Pattern Matching 자체는 C# 7부터 지원
- Relational Pattern, Logical Pattern 등이 C# 9에서 추가
범위 비교 (Relational Pattern)
C# 9.0부터는 when 키워드 없이도 관계 연산자를 직접 사용
int temperature = 28;
string weather = temperature switch
{
>= 30 => "폭염",
>= 20 => "쾌적함",
>= 10 => "쌀쌀함",
_ => "추움"
};
여러 변수 동시에 비교 (Tuple Pattern)
두 개 이상의 상태를 조합해서 분기해야 할 때, if-else 중첩 없이 튜플 패턴으로 깔끔하게 해결
string state = "Running";
bool hasError = true;
// (상태, 에러여부)를 한 번에 검사
string message = (state, hasError) switch
{
("Running", false) => "정상 작동 중",
("Running", true) => "작동 중이나 오류 발생",
("Stopped", _) => "시스템 중지됨", // _는 true/false 상관없음
_ => "알 수 없는 상태"
};
객체 속성 비교 (Property Pattern)
객체 내부의 특정 프로퍼티 값에 따라 분기할 수도 있음
var user = new User { Role = "Admin", IsDeleted = false };
string accessLevel = user switch
{
{ Role: "Admin", IsDeleted: false } => "관리자 권한",
{ Role: "User", IsDeleted: false } => "일반 사용자",
{ IsDeleted: true } => "삭제된 계정",
_ => "접근 불가" // null 포함
};
// 객체가 null인 경우도 자동으로 _
리턴값이 없는 메서드(Action) 실행
Action 델리게이트를 반환받아 즉시 실행
switch expression은 “값”을 반환하므로 델리게이트(함수 포인터)를 반환하는 것도 가능
int command = 1;
// 1. 각 조건에 맞는 Action(행동)을 선택하고
// 2. 마지막의 ()로 즉시 실행합니다.
(command switch
{
1 => (Action)(() => SaveData()),
2 => () => LoadData(),
_ => () => Console.WriteLine("대기")
})();
// 마지막 ()는 "반환된 델리게이트 실행"



