강력한 패턴 매칭
`match` 표현식과 기타 패턴 매칭 구문을 능숙하게 사용하여 데이터 변형을 간결하고 빠짐없이 처리합니다.
강력한 패턴 매칭은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 3개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 3개의 강의가 포함되어 있습니다.
패턴 매칭의 힘 발휘하기
Rust의 패턴 매칭 세계에 오신 것을 환영합니다! 이 강력한 기능을 사용하면 데이터의 구조에 따라 프로그램 흐름을 제어할 수 있습니다.
단순히 같은지 확인하는 대신 값을 분해하고, 구성 요소를 추출하며, 데이터 형태에 따라 특정 코드를 실행할 수 있습니다.
- 강력해진
if/else또는switch문과 비슷합니다. - 완전성을 보장하므로 가능한 모든 패턴을 처리해야 합니다.
- 코드를 더 읽기 쉽고 견고하게 만들어 줍니다.
`match` 표현식 기초
패턴 매칭의 핵심은 match 표현식입니다. 이 표현식은 값을 받아 일련의 패턴과 비교합니다. 일치하는 첫 번째 패턴이 선택됩니다!
match 표현식의 각 '분기'는 패턴과 해당 패턴이 일치할 때 실행할 코드로 구성됩니다.
enum Direction {
North,
East,
South,
West,
}
fn main() {
let my_direction = Direction::North;
match my_direction {
Direction::North => println!("Going up!"),
Direction::East => println!("Going right!"),
Direction::South => println!("Going down!"),
Direction::West => println!("Going left!"),
}
}리터럴과 범위 매칭하기
특정 리터럴 값(숫자, 문자, 불리언)과 매칭하거나 ..=을 사용해 범위를 정의할 수 있습니다. | 연산자를 사용하면 하나의 분기에서 여러 패턴을 매칭할 수 있습니다.
패턴은 순서대로 확인되며 첫 번째로 일치하는 패턴이 사용된다는 점을 기억하세요.
fn main() {
let x = 7;
match x {
1 => println!("It's one!"),
2 | 3 => println!("It's two or three!"),
4..=8 => println!("It's between four and eight!"),
_ => println!("It's something else!"), // Catch-all
}
let character = 'b';
match character {
'a'..='e' => println!("Early letter"),
_ => println!("Other letter"),
}
}구조체 분해하기
구조체처럼 복잡한 데이터 타입을 분해할 때 패턴 매칭의 진가가 드러납니다. match 분기 안에서 개별 필드를 변수로 직접 추출할 수 있습니다.
따라서 특정 필드 값과 매칭할 때 구조체 데이터에 깔끔하고 간결하게 접근할 수 있습니다.
struct Point {
x: i32,
y: i32,
}
fn main() {
let p = Point { x: 0, y: 7 };
match p {
Point { x, y: 0 } => println!("On the X axis at {}", x),
Point { x: 0, y } => println!("On the Y axis at {}", y),
Point { x, y } => println!("Not on an axis: ({}, {})", x, y),
}
}데이터가 있는 열거형 분해하기
Rust의 열거형은 관련 데이터를 포함할 수 있습니다. 패턴 매칭은 열거형 변형에서 이 데이터를 추출하는 기본 방법입니다.
데이터를 새 변수로 직접 분해할 수 있으므로 각 변형의 내용을 쉽게 다룰 수 있습니다.
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."),
Message::Move { x, y } => {
println!("Move to x: {}, y: {}", x, y);
}
Message::Write(text) => println!("Text message: {}", text),
Message::ChangeColor(r, g, b) => {
println!("Color: R:{}, G:{}, B:{}", r, g, b);
}
}
}
fn main() {
process_message(Message::Move { x: 10, y: 20 });
process_message(Message::Write(String::from("Hello!")));
}와일드카드 패턴 `_`
특수한 _(밑줄) 패턴은 모든 경우를 처리하는 패턴으로 동작합니다. 어떤 값과도 일치하지만 해당 값에 바인딩되지는 않습니다.
완전성을 위해 모든 가능성을 처리해야 하지만 특정 분기와 일치하는 값 자체에는 관심이 없을 때 유용합니다.
fn main() {
let some_value = Some(5);
let absent_value: Option<i32> = None;
match some_value {
Some(x) => println!("Got a value: {}", x),
_ => println!("Something else!"), // Matches None too
}
match absent_value {
Some(x) => println!("Got a value: {}", x),
_ => println!("No value here!"),
}
}단일 패턴에 사용하는 `if let`
때로는 특정 패턴 하나만 매칭하고 나머지는 모두 무시하고 싶을 수 있습니다. 이러한 경우 if let은 전체 match 표현식보다 간결한 대안입니다.
이는 기본적으로 다음과 같은 의미입니다. "이 패턴이 일치하면 이 작업을 하고, 그렇지 않으면 아무 작업도 하지 않습니다(또는 선택적인 else 블록을 실행합니다)."
fn main() {
let config_max = Some(3u8);
let none_value: Option<u8> = None;
if let Some(max) = config_max {
println!("Max configured to be: {}", max);
}
if let Some(val) = none_value {
println!("This won't print: {}", val);
} else {
println!("No value found!");
}
}조건부 반복문에 사용하는 `while let`
if let과 비슷하게 while let을 사용하면 패턴이 계속 일치하는 동안 반복할 수 있습니다.
Vec과 같은 컬렉션에서 항목을 처리할 때 매우 유용합니다. 더 이상 일치하는 요소가 없을 때까지 계속할 수 있기 때문입니다(예: pop()이 None을 반환할 때까지).
fn main() {
let mut stack = vec![1, 2, 3];
while let Some(top) = stack.pop() {
println!("Popped: {}", top);
}
println!("Stack is empty now.");
}매치 가드: 조건 추가하기
match 분기에 매치 가드라고 하는 추가 if 조건을 넣을 수 있습니다. 해당 분기가 실행되려면 패턴이 일치하고 가드 조건도 참이어야 합니다.
이를 사용하면 열거형 변형을 더 만들지 않고도 패턴 내부를 더욱 세밀하게 제어할 수 있습니다.
fn main() {
let num = Some(4);
match num {
Some(x) if x % 2 == 0 => println!("Even number: {}", x),
Some(x) if x < 5 => println!("Small odd number: {}", x),
Some(x) => println!("Any other number: {}", x),
None => println!("No number"),
}
}패턴 매칭 도전 과제
다음 Rust 코드 조각을 살펴보세요. match 표현식과 그 출력에 관한 다음 설명 중 TRUE인 것은 무엇일까요?
enum Status {
Loading,
Success(u32),
Error(String),
}
fn process_status(s: Status) {
match s {
Status::Success(code) if code > 200 => println!("Success with high code: {}", code),
Status::Success(code) => println!("Success with code: {}", code),
Status::Error(msg) => println!("Failed: {}", msg),
_ => println!("Status unknown or loading..."),
}
}
fn main() {
process_status(Status::Success(201));
process_status(Status::Error(String::from("Network issue")));
process_status(Status::Loading);
process_status(Status::Success(200));
}복습: 패턴 완전히 익히기
Rust 패턴 매칭의 놀라운 힘을 살펴보았습니다! 패턴 매칭은 명확하고 간결하며 안전한 코드를 작성하기 위한 기본 개념입니다.
match표현식은 데이터 구조에 따른 완전한 흐름 제어를 제공합니다.- 리터럴, 범위, 와일드카드(
_)를 사용해 매칭할 수 있습니다. - 분해를 사용하면 구조체와 열거형에서 값을 직접 추출할 수 있습니다.
if let과while let은 단일 패턴을 간결하게 매칭하는 방법을 제공합니다.- 매치 가드는
match분기에 조건부 로직을 추가합니다.
이러한 패턴을 계속 연습하세요. 관용적인 Rust 코드를 작성하는 데 꼭 필요합니다!
자주 묻는 질문
“강력한 패턴 매칭” 강의는 무료인가요?
네 — “강력한 패턴 매칭” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 3개의 강의가 포함되어 있습니다.
“강력한 패턴 매칭”에서 뭘 배우나요?
`match` 표현식과 기타 패턴 매칭 구문을 능숙하게 사용하여 데이터 변형을 간결하고 빠짐없이 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 3번째 강의입니다.
“강력한 패턴 매칭” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 구조체 정의와 사용
- 사용자 정의 형식을 위한 열거형
- 강력한 패턴 매칭