Rust 패턴 매칭(Pattern Matching) 제대로 배우기
Rust 패턴 매칭(Pattern Matching) 제대로 배우기
Rust의 패턴 매칭은 강력하고 유연한 제어 흐름 도구로, 다양한 상황에서 조건을 깔끔하고 안전하게 처리할 수 있게 해줍니다. 특히 match
문은 단순한 조건 분기 이상의 역할을 하며, 열거형(enum), 튜플, 구조체 등 복잡한 데이터 구조를 효과적으로 다루는 핵심 기능입니다.
패턴 매칭이란 무엇인가?
패턴 매칭은 값의 구조를 분해하고, 해당 값이 특정 형태에 맞는지 확인하여 코드의 흐름을 제어하는 기법입니다. Rust에서는 match
키워드를 통해 다양한 패턴을 선언하고 매칭할 수 있습니다.
기본 match 문법과 사용법
가장 기본적인 match
예제입니다. 변수의 값에 따라 다른 코드를 실행합니다.
let number = 2;
match number {
1 => println!("하나입니다."),
2 => println!("둘입니다."),
3 => println!("셋입니다."),
_ => println!("그 외 숫자입니다."),
}
여기서 _
는 모든 나머지 경우를 의미하는 와일드카드 패턴으로, 반드시 포함해야 합니다.
여러 값 묶어서 처리하기
여러 값을 하나의 패턴으로 묶어 처리할 수 있습니다. 예를 들어 2와 3을 같은 코드로 처리할 때 이렇게 작성합니다.
match number {
2 | 3 => println!("둘 또는 셋입니다."),
_ => println!("기타 숫자입니다."),
}
범위 패턴 사용하기
숫자의 범위를 지정하여 패턴을 매칭할 수도 있습니다.
match number {
1..=5 => println!("1부터 5 사이 숫자입니다."),
_ => println!("5 초과 숫자입니다."),
}
열거형(enum)과 패턴 매칭
Rust의 enum
타입과 패턴 매칭은 함께 쓰일 때 매우 강력합니다. 예를 들어, 열거형을 선언하고 그 상태에 따라 분기하는 예제입니다.
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn process_message(msg: Message) {
match msg {
Message::Quit => println!("Quit 메시지 처리"),
Message::Move { x, y } => println!("Move to x: {}, y: {}", x, y),
Message::Write(text) => println!("메시지 쓰기: {}", text),
Message::ChangeColor(r, g, b) => {
println!("색상 변경: r={}, g={}, b={}", r, g, b);
}
}
}
이처럼 열거형의 각 변종(variant)을 분해(destructuring)하여 내부 데이터를 바로 꺼낼 수 있습니다.
튜플과 구조체 패턴
튜플과 구조체도 패턴 매칭에서 직접 분해할 수 있습니다.
let point = (3, 5);
match point {
(0, y) => println!("x는 0이고 y는 {}", y),
(x, 0) => println!("y는 0이고 x는 {}", x),
(x, y) => println!("x는 {}, y는 {}", x, y),
}
구조체도 마찬가지로 필드 이름으로 값을 분해할 수 있습니다.
struct Point {
x: i32,
y: i32,
}
let p = Point { x: 0, y: 7 };
match p {
Point { x: 0, y } => println!("x는 0이고 y는 {}", y),
Point { x, y: 0 } => println!("y는 0이고 x는 {}", x),
Point { x, y } => println!("x는 {}, y는 {}", x, y),
}
패턴 매칭에서 변수 바인딩
패턴 안에서 변수 이름을 붙여 해당 부분을 바인딩할 수 있습니다. 다음 예제를 보세요.
let num = Some(5);
match num {
Some(n @ 1..=5) => println!("1부터 5 사이의 값: {}", n),
Some(n) => println!("기타 값: {}", n),
None => println!("값이 없음"),
}
if 조건과 함께 쓰는 패턴 매칭 (if guard)
패턴에 추가 조건을 붙이고 싶을 때는 if
가드를 사용합니다.
let x = 4;
match x {
n if n % 2 == 0 => println!("짝수: {}", n),
n => println!("홀수: {}", n),
}
결론: Rust 패턴 매칭은 안전하고 표현력이 뛰어나다
Rust의 패턴 매칭은 단순한 조건문을 넘어서 복잡한 데이터 구조를 안전하고 간결하게 처리하는 매우 강력한 기능입니다. 열거형, 튜플, 구조체, 변수 바인딩, if guard 등 다양한 패턴 매칭 기법을 익히면 Rust 프로그래밍이 훨씬 더 직관적이고 효율적으로 변합니다.
초보자도 반복적인 연습과 예제 학습을 통해 빠르게 익힐 수 있으니, 차근차근 다양한 패턴을 직접 사용해보시길 권장합니다.