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
고전 switch는 statement("문")고, switch-표현식은 expression이야. 즉, 값을 계산해서 바로 변수에 넣거나 메서드에서 반환할 수 있지.
switch-표현식 구조:
var result = value switch
{
pattern1 => expression1,
pattern2 => expression2,
_ => defaultExpression // "언더스코어"는 "그 외"라는 뜻
};
예시:
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-표현식에서 반환하는 값의 타입이, 할당하는 변수 타입이랑 맞는지 꼭 확인해!
GO TO FULL VERSION