CodeGym /행동 /C# SELF /switch-표현식과 새로운 패턴들

switch-표현식과 새로운 패턴들

C# SELF
레벨 10 , 레슨 5
사용 가능

1. 들어가기

이미 이런 코드는 쓸 줄 알지?

switch (color)
{
    case "red":
        Console.WriteLine("멈춰!");
        break;
    case "yellow":
        Console.WriteLine("기다려...");
        break;
    case "green":
        Console.WriteLine("가도 돼!");
        break;
    default:
        Console.WriteLine("이 색 뭐야?");
        break;
}

근데 만약에 입력 파라미터에 따라 변수에 다른 값을 넣고 싶거나, 함수에서 숫자에 따라 문자열을 반환하고 싶으면? switch-표현식 나오기 전엔 이런 식으로 짰어야 했지:

string meaning;
switch (number)
{
    case 42:
        meaning = "삶, 우주, 모든 것에 대한 답";
        break;
    case 7:
        meaning = "행운의 숫자";
        break;
    default:
        meaning = "평범한 숫자";
        break;
}

뭔가 21세기 언어치곤 별로 세련되지 않지? 함수형 언어처럼 바로 값을 반환하고 싶잖아.

여기서 switch-표현식이 등장해! 이건 C# 8.0부터 들어온 가장 예쁘고(그리고 최신) 기능 중 하나야.

2. switch-표현식: 안아주고 싶은 문법

비교: statement vs expression
고전 switchstatement("문")고, switch-표현식expression이야. 즉, 값을 계산해서 바로 변수에 넣거나 메서드에서 반환할 수 있지.

switch-표현식 구조:


var result = value switch
{
    pattern1 => expression1,
    pattern2 => expression2,
    _       => defaultExpression // "언더스코어"는 "그 외"라는 뜻
};
switch-표현식 문법

예시:

int number = 42;
string meaning = number switch
{
    42 => "삶, 우주, 모든 것에 대한 답",
    7  => "행운의 숫자",
    _  => "평범한 숫자"
};
Console.WriteLine(meaning); // => 삶, 우주, 모든 것에 대한 답

진짜 간결하고, 읽기 쉽고, 코드 길이도 짧고, break;도 없어.

참고: 언더스코어 _는 "나머지 전부"를 잡아주는 거야, default랑 똑같아.

3. switch-표현식과 패턴: 같이 쓰면 꿀

여기서부터 진짜 재밌어져. switch-표현식에서는 그냥 값만 비교하는 게 아니라, 패턴도 쓸 수 있어: 범위, 타입, 객체 프로퍼티, 디컨스트럭션(객체를 부분으로 쪼개기), 그리고 combinatorial patterns(and, or, not)까지!

switch-표현식에서 패턴 예시

상수 패턴
위에서 한 것처럼 42, 7 등과 비교하는 거야.

범위와 비교

int age = 17;
string category = age switch
{
    < 18 => "미성년자",
    >= 18 and <= 65 => "성인",
    > 65 => "노인",
    _ => "알 수 없는 연령대"
};
Console.WriteLine(category);

참고로, 조건 여러 개도 같이 쓸 수 있어! C# 점점 더 표현력 좋아진다니까.

타입 패턴(Type Patterns)

예를 들어, 어떤 객체가 여러 타입일 수 있을 때(object value;), 이렇게 처리할 수 있어:

object value = 3.14;
string description = value switch
{
    int i => $"정수: {i}",
    double d => $"실수: {d:F2}",
    string s => $"이건 문자열: '{s}'",
    null => "null!",
    _ => "다른 무언가"
};
Console.WriteLine(description); // => 실수: 3.14

프로퍼티 패턴(Property Patterns)과 위치 패턴(Positional Patterns)

C# 8 이후로는 switch-표현식 안에서 객체의 프로퍼티 값을 바로 체크할 수 있어.

객체 예시

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

User user = new User { Name = "안나", Age = 17 };
string welcome = user switch
{
    { Age: < 18 } => $"안녕, {user.Name}! 너는 청소년이야.",
    { Age: >= 18 and <= 65 } => $"안녕, {user.Name}! 어른의 삶은 멋져.",
    { Age: > 65 } => $"환영해요, {user.Name}! 언제나 반가워요.",
    _ => "알 수 없는 나이"
};
Console.WriteLine(welcome);

여기서 중괄호 { Age: < 18 }는 property pattern이야. 즉, 객체 전체가 아니라 특정 프로퍼티만 체크하는 거지.

4. C# 11-14의 새로운 패턴

C#은 점점 더 간결하고 유연해지고 있어. 최근엔 combinatorial patterns (and, or, not)이 추가됐고, 위치 패턴도 더 좋아졌어. 같이 보자!

논리 패턴: and, or, not

수학 논리처럼 복잡한 조건도 만들 수 있어!

int temperature = 25;
string result = temperature switch
{
    < 0 => "영하!",
    >= 0 and < 20 => "쌀쌀해",
    >= 20 and < 30 => "딱 좋아",
    >= 30 or <= -30 => "극한!",
    _ => "이상한 온도"
};

특정 경우를 빼고 싶으면 이렇게:

int score = 80;
string grade = score switch
{
    >= 90 => "최고",
    >= 60 and not >= 90 => "좋음",
    _ => "나쁨"
};

디컨스트럭션(Positional Patterns)

구조체나 record가 디컨스트럭션을 지원하면, switch-표현식에서 바로 객체를 쪼갤 수 있어:

public record Point(int X, int Y);

Point p = new Point(10, 20);
string desc = p switch
{
    (0, 0) => "원점",
    (var x, 0) => $"X축 위, X={x}",
    (0, var y) => $"Y축 위, Y={y}",
    (var x, var y) when x == y => $"대각선 위: {x}",
    _ => $"좌표 ({p.X}, {p.Y})"
};
Console.WriteLine(desc); // => 좌표 (10, 20)

5. 언제, 왜 switch-표현식을 써야 할까?

요즘 C#에서 switch-표현식은 그냥 멋진 "기능"이 아니라, 진짜로 코드 길이 줄이고, 테스트랑 유지보수 쉽게 해주는 실전 무기야. 파서, 명령 처리기, 비즈니스 로직, 규칙 설정 등 복잡한 분기 처리할 때 특히 좋아. 값뿐만 아니라 타입, 범위, 프로퍼티, 조합 조건까지 다 다룰 수 있으니까.

면접에서

  • 사용자 응답이 여러 가지일 때 어떻게 처리할래?
  • 타입과 값에 따라 함수 반환값 다르게 하려면?
  • if-else 잔뜩 안 쓰고 새 규칙 쉽게 추가하려면?

switch-표현식에 패턴까지 보여주면, 최신 C# 잘 쓰는 센스 있는 개발자라는 거 바로 티나!

표: switch-문 vs switch-표현식 비교

특징 switch statement switch expression
타입 문(statement) 표현식(expression)
break 사용 필수 필요 없음
값 반환 가능 변수로만 가능 네, 바로 값 반환
패턴 사용 부분적으로만 완전 가능(type, property 등)
함정 break 빼먹을 수 있음 모든 경로가 값 반환해야 함

6. 흔한 실수와 작은 함정들

  • 초보 개발자들은 switch-문("statement")과 switch-표현식("expression") 차이를 자주 헷갈려. 예를 들어, switch-표현식에는 break;가 필요 없고, 모든 분기가 반드시 값을 반환해야 한다는 걸 잊지 마.
  • _ 분기를 빼먹으면, 컴파일러가 "그럼 아무것도 안 맞으면 어쩔래?"라고 알려줘.
  • switch-표현식에서는 goto 못 써(이건 오히려 다행!).
  • 조건이 중복되면(예: 같은 패턴 두 번), 컴파일러가 에러 내.
  • switch-표현식에서 반환하는 값의 타입이, 할당하는 변수 타입이랑 맞는지 꼭 확인해!
1
설문조사/퀴즈
상수랑 키워드 var, 레벨 10, 레슨 5
사용 불가능
상수랑 키워드 var
상수, 구조체, enum 그리고 switch
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION