← 문제로

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 가드: 패턴이 표현 못 하는 임의 조건. 패턴 매칭 후 부울식으로 추가 필터.

단계별 동작(각 입력)

  1. nullnull 팔. null 패턴은 형식 검사 없이 참조 null 을 잡는다(가장 먼저 두는 이유).
  2. 200(박싱 int) → int and > 100 매칭 → big-int.
  3. -5int and > 100 실패 → int n when n < 0 매칭(언박싱 후 -5 < 0) → neg-int.
  4. 0>100 아님, when n<0 아님, 상수 패턴 0 매칭 → zero. (상수 패턴이 형식 패턴 int 보다 위에 있어야 small-int 로 새지 않는다.)
  5. 50 → 위 셋 모두 실패, 형식 패턴 int 매칭 → small-int.
  6. ""int 계열 모두 실패, string { Length: 0 } 매칭 → empty-str.
  7. "hello" → 빈 문자열 아님 → string s 매칭, s.Length==5str:5.
  8. 3.14(박싱 double) → int/string 아무것도 안 걸림 → _other.
  9. IsSmallPositive(5)5 is int and > 0 and < 10 → True.
  10. IsSmallPositive(50) → int 이고 >0 이지만 < 10 실패 → False.
  11. IsSmallPositive("x") → int 아님 → False.

흔한 오해·함정

  • 패턴 순서 의존: switch 식은 첫 일치를 취한다. 더 구체적인(좁은) 패턴을 위에 둬야 한다. 예에서 0int 아래에 두면 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 같은 상수 패턴 함정.