39. 패턴 매칭(is / switch 식)의 내부 동작
난이도 상내 리뷰 · C#
해설 · C#
해설 — 패턴 매칭(is / switch 식)의 내부 동작
난이도: 상
요약
패턴 매칭은 형식 검사·언박싱·값 비교를 하나의 문법으로 결합한다. switch 식은 위에서 아래로 첫 번째로 일치하는 팔(arm) 을 고르며, 형식 패턴은 object 에 대해 형식 검사 + (값 형식이면) 언박싱을 수행한다. 출력:
null
big-int
neg-int
zero
small-int
empty-str
str:5
other
True
False
False
핵심 개념
- 형식 패턴
int:o is int검사. 성공 시 값 형식은 언박싱되어 정수로 다뤄진다. - 상수 패턴
0: 입력이 해당 상수와 같은지(형식 일치 + 동등).object에 대해0은 "박싱된 int 이고 0" 일 때 매칭. - 관계 패턴
> 100,< 0: 비교. 단독으로 쓰면 입력 형식이 그 비교와 호환되어야 하며, 보통 형식 패턴과and로 결합한다. - 논리 패턴
and/or/not: 패턴을 조합.int and > 100= "int 이면서 100 초과". - 속성 패턴
string { Length: 0 }: 형식 검사 후 멤버 값 매칭. - when 가드: 패턴이 표현 못 하는 임의 조건. 패턴 매칭 후 부울식으로 추가 필터.
단계별 동작(각 입력)
null→null팔.null패턴은 형식 검사 없이 참조 null 을 잡는다(가장 먼저 두는 이유).200(박싱 int) →int and > 100매칭 →big-int.-5→int and > 100실패 →int n when n < 0매칭(언박싱 후-5 < 0) →neg-int.0→>100아님,when n<0아님, 상수 패턴0매칭 →zero. (상수 패턴이 형식 패턴int보다 위에 있어야small-int로 새지 않는다.)50→ 위 셋 모두 실패, 형식 패턴int매칭 →small-int.""→int계열 모두 실패,string { Length: 0 }매칭 →empty-str."hello"→ 빈 문자열 아님 →string s매칭,s.Length==5→str:5.3.14(박싱 double) → int/string 아무것도 안 걸림 →_→other.IsSmallPositive(5)→5 is int and > 0 and < 10→ True.IsSmallPositive(50)→ int 이고 >0 이지만< 10실패 → False.IsSmallPositive("x")→ int 아님 → False.
흔한 오해·함정
- 패턴 순서 의존: switch 식은 첫 일치를 취한다. 더 구체적인(좁은) 패턴을 위에 둬야 한다. 예에서
0을int아래에 두면small-int로 잘못 걸린다. 컴파일러는 "앞 팔이 뒤 팔을 완전히 가리면" 도달 불가 경고를 준다. - 언박싱 비용:
object→ 값 형식 형식 패턴은 언박싱(값 복사)을 유발한다. 핫패스에서 다형 디스패치 대신 패턴 매칭 남발 시 박싱/언박싱 비용 주의. - 관계 패턴 단독:
case > 100:은 입력 정적 형식이 int 같은 비교 가능한 형식일 때만.object스위치에선 형식 패턴과 결합(int and > 100)해야 한다. - 상수 패턴의 동등성: 문자열·enum·정수 상수는
==/Equals의미로 비교.double.NaN은 상수 패턴NaN으로 매칭되지 않으니(부동소수점 == 규칙)double.IsNaN을 써야 한다. - exhaustiveness: switch 식은 모든 입력을 덮지 못하면
_없이 컴파일 경고 + 런타임 미일치 시SwitchExpressionException. 예제는_로 완전. - when vs 관계 패턴: 가능한 조건은 관계/논리 패턴으로 표현하면 컴파일러가 도달성·완전성 분석을 더 잘한다.
when은 임의 조건용 탈출구.
면접 포인트
- switch 식의 순서 의존성과 도달 불가/완전성(exhaustiveness) 분석,
SwitchExpressionException. object에 대한 형식 패턴의 언박싱 비용과, 값 형식 다수 분기 시 성능 고려.- 관계·논리·속성 패턴으로
when가드를 대체할 때의 이점(컴파일러 분석), NaN 같은 상수 패턴 함정.