C# Switch 식(Expression)

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("대기")
})(); 
// 마지막 ()는 "반환된 델리게이트 실행"

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤