'Result'와 함께 'match' 사용하기
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 43번째.
이제 Result가 무엇인지 이해했으므로, 성공과 실패 사례를 모두 처리하는 가장 명시적이고 강력한 방법인 match 표현식을 사용하는 법을 배워보겠습니다.
Option과 마찬가지로, match는 Result의 두 가지 변형(variant)을 모두 처리하도록 강제합니다. 성공을 처리하기 위해 Ok에 대한 팔(arm)을 하나 만들고, 실패를 처리하기 위해 Err에 대한 또 다른 팔을 만듭니다:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}Result가 Ok일 때, match는 성공한 값을 추출하고 첫 번째 분기를 실행합니다. Err일 때는 에러 정보를 추출하고 두 번째 분기를 실행합니다. 이 패턴은 잠재적인 에러를 실수로 무시하지 않도록 보장합니다.
챌린지
쉬움두 개의 입력을 받게 됩니다. 첫 번째 입력은 숫자(문자열 형태)이고, 두 번째 입력도 숫자(문자열 형태)입니다. 첫 번째 숫자를 두 번째 숫자로 나누는 시도를 하고 Result<f64, &'static str>를 반환하는 함수를 만드세요. 만약 두 번째 숫자가 0이라면, "Division by zero"라는 메시지와 함께 Err를 반환하세요. 그렇지 않으면 나눗셈 결과와 함께 Ok를 반환하세요. match 표현식을 사용하여 Ok와 Err 케이스를 모두 처리하고 적절한 메시지를 출력하세요.
요구 사항:
- 첫 번째 입력(피제수)을 읽고 공백을 제거합니다.
- 첫 번째 입력을
f64로 파싱합니다. - 두 번째 입력(제수)을 읽고 공백을 제거합니다.
- 두 번째 입력을
f64로 파싱합니다. - 두 개의
f64매개변수를 받고Result<f64, &'static str>를 반환하는 함수를 만듭니다. - 함수 내부에서 제수가
0.0인지 확인합니다:- 만약 그렇다면,
Err("Division by zero")를 반환합니다. - 그렇지 않다면,
Ok(dividend / divisor)를 반환합니다.
- 만약 그렇다면,
- 파싱된 두 숫자로 함수를 호출합니다.
match표현식을 사용하여Result를 처리합니다.Ok(value)분기에서는Result: [value]를 출력합니다.Err(error)분기에서는Error: [error]를 출력합니다.
입력:
- 첫 번째 줄: 피제수를 나타내는 숫자 (예:
10.0) - 두 번째 줄: 제수를 나타내는 숫자 (예:
2.0)
출력:
- 나눗셈에 성공한 경우:
Result: [result] - 0으로 나눈 경우:
Error: Division by zero
치트 시트
match를 사용하여 Result의 Ok와 Err 변형(variant)을 모두 처리합니다:
let result = divide(10, 2);
match result {
Ok(value) => println!("Division successful: {}", value),
Err(error) => println!("Division failed: {}", error),
}match 표현식은 성공과 실패 사례를 모두 처리하도록 강제합니다. Result가 Ok인 경우, 성공한 값을 추출하여 첫 번째 팔(arm)을 실행합니다. Err인 경우, 에러 정보를 추출하여 두 번째 팔을 실행합니다.
직접 해보기
use std::io;
// TODO: Result<f64, &'static str>를 반환하는 divide 함수를 여기에 작성하세요
fn main() {
// 첫 번째 입력 읽기 (피제수)
let mut dividend_input = String::new();
io::stdin().read_line(&mut dividend_input).expect("Failed to read line");
let dividend: f64 = dividend_input.trim().parse().expect("Invalid number");
// 두 번째 입력 읽기 (제수)
let mut divisor_input = String::new();
io::stdin().read_line(&mut divisor_input).expect("Failed to read line");
let divisor: f64 = divisor_input.trim().parse().expect("Invalid number");
// TODO: divide 함수를 호출하고 match를 사용하여 Result를 처리하세요
// Ok 케이스의 경우 "Result: [value]"를 출력하세요
// Err 케이스의 경우 "Error: [error]"를 출력하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Logic & Flow의 모든 레슨
7'Result'를 이용한 에러 처리
'Result'란 무엇인가요?'Result'와 함께 'match' 사용하기is_ok()와 is_err()단축 방법: unwrap과 expect물음표 연산자 '?'문자열을 숫자로 파싱하기요약 - 안전한 나눗셈 함수