'Option' 언래핑하기
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 38번째.
때로는 Option이 Some을 포함하고 있다고 확신할 때 그 안의 실제 값을 추출해야 할 필요가 있습니다. Rust는 이 목적을 위해 .unwrap() 메서드를 제공합니다. 이 메서드는 Some에서 값을 꺼내어 직접 제공합니다.
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);Some(value)에 대해 .unwrap()을 호출하면 내부 값을 반환합니다. 위의 예시에서 actual_number는 42가 되며, 더 이상 Option에 감싸여 있지 않습니다.
하지만 중대한 경고가 있습니다: None에 대해 .unwrap()을 호출하면 프로그램이 패닉(panic) 상태에 빠지고 즉시 종료됩니다. 이로 인해 .unwrap()은 Option이 Some을 포함하고 있다는 것이 절대적으로 확실할 때만 사용해야 하는 잠재적으로 위험한 메서드가 됩니다.
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // 여기서 패닉이 발생합니다!.unwrap()은 드물게 사용해야 하며, 간단한 예제나 이미 .is_some()으로 확인한 경우와 같이 Option이 값을 포함하고 있음을 보장할 수 있는 상황에서만 사용하세요.
챌린지
쉬움두 개의 입력을 받게 됩니다. 첫 번째 입력은 숫자(문자열 형태)이고, 두 번째 입력은 이 숫자를 유효한 것으로 처리할지 아니면 유효하지 않은 것으로 처리할지를 나타냅니다. 만약 두 번째 입력이 valid라면, 파싱된 숫자를 Some에 담고 있는 Option<i32>를 생성하세요. 만약 두 번째 입력이 invalid라면, None을 담고 있는 Option<i32>를 생성하세요. .unwrap()을 사용하여 Option에서 값을 추출하고 이를 출력하세요.
요구 사항:
- 첫 번째 입력을 읽고 공백을 제거합니다.
- 두 번째 입력을 읽고 공백을 제거합니다.
.parse::<i32>()를 사용하여 첫 번째 입력을i32로 파싱합니다.Option<i32>변수를 생성합니다:- 두 번째 입력이
valid인 경우,Some(parsed_number)를 할당합니다. - 두 번째 입력이
invalid인 경우,None을 할당합니다.
- 두 번째 입력이
.unwrap()을 사용하여Option에서 값을 추출합니다.- 추출된 값을
Value: [number]형식으로 출력합니다.
입력:
- 첫 번째 줄: 문자열 형태의 숫자 (예:
42) - 두 번째 줄:
valid또는invalid
출력:
- 두 번째 입력이
valid인 경우:Value: [number] - 두 번째 입력이
invalid인 경우: 프로그램이 패닉(panic)을 일으킵니다 (이 챌린지에서 의도된 동작입니다).
참고: 두 번째 입력이 invalid일 때, None에 대해 .unwrap()을 호출하면 패닉이 발생합니다. 이는 Option에 값이 들어있는지 확실하지 않을 때 .unwrap()을 사용하는 것이 얼마나 위험한지를 보여줍니다.
치트 시트
.unwrap() 메서드는 Option<T>에서 값을 추출합니다:
let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number); // 출력: The number is: 42경고: None에 대해 .unwrap()을 호출하면 프로그램이 패닉(panic) 상태가 되어 종료됩니다:
let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // 여기서 패닉이 발생합니다!Option이 Some 값을 포함하고 있다는 것이 확실할 때만 .unwrap()을 사용하세요.
직접 해보기
use std::io;
fn main() {
// 첫 번째 입력 읽기 (문자열 형태의 숫자)
let mut number_input = String::new();
io::stdin().read_line(&mut number_input).expect("Failed to read line");
let number_input = number_input.trim();
// 두 번째 입력 읽기 (valid 또는 invalid)
let mut validity_input = String::new();
io::stdin().read_line(&mut validity_input).expect("Failed to read line");
let validity_input = validity_input.trim();
// 숫자 파싱
let parsed_number: i32 = number_input.parse().expect("Failed to parse number");
// TODO: 아래에 코드를 작성하세요
// validity_input에 따라 Option<i32>를 생성하세요
// validity_input이 "valid"이면 Some(parsed_number)를 할당하세요
// validity_input이 "invalid"이면 None을 할당하세요
// 그 다음 .unwrap()을 사용하여 값을 추출하고 "Value: [number]" 형식으로 출력하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Logic & Flow의 모든 레슨
6'Option'으로 값이 없는 경우 처리하기
'Option'이란 무엇인가요?'Option'과 함께 'match' 사용하기is_some()과 is_none()'Option' 언래핑하기expect 메서드기본값 제공하기: unwrap_or요약 - 요소 찾기