🎯

패턴 매칭 — match와 if let으로 분기하기

switch/case의 상위 호환, Rust 코드의 핵심 표현 방식

C/Java의 switch-case는 값을 비교만 한다. Rust의 match는 값을 분해(destructure)하면서 동시에 분기한다.

match some_option {
    Some(value) => println!("got {value}"),
    None => println!("nothing"),
}

Some 안의 값을 꺼내면서 분기가 동시에 일어난다. 그리고 컴파일러가 모든 경우를 처리했는지 검사한다. case를 하나라도 빼먹으면 컴파일이 안 된다.

if let은 match의 축약형이다. 한 가지 패턴만 관심 있을 때 쓴다:

if let Some(value) = some_option {
    println!("got {value}");
}

enum, 튜플, 구조체, 참조 — Rust의 거의 모든 타입을 패턴으로 분해할 수 있다.

핵심 포인트

1

match 식에 값을 넣으면 각 arm의 패턴과 순서대로 매칭

2

패턴이 값을 분해(destructure)하면서 변수에 바인딩

3

exhaustive — 모든 가능한 경우를 빠짐없이 처리해야 컴파일 통과

4

_ (와일드카드)로 나머지 경우를 한 번에 처리 가능

장점

  • 빠뜨린 케이스를 컴파일러가 잡아준다
  • 값 비교 + 분해 + 바인딩이 한 번에

단점

  • 깊은 중첩 패턴은 가독성이 떨어질 수 있다

사용 사례

Result/Option 처리 — 성공/실패, 있음/없음을 명시적으로 분기 enum 기반 상태 머신 — 각 상태별 동작을 패턴으로 정의