Menu
Coddy logo textTech

'Option' 언래핑하기

Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 38번째.

때로는 OptionSome을 포함하고 있다고 확신할 때 그 안의 실제 값을 추출해야 할 필요가 있습니다. Rust는 이 목적을 위해 .unwrap() 메서드를 제공합니다. 이 메서드는 Some에서 값을 꺼내어 직접 제공합니다.

let maybe_number = Some(42);
let actual_number = maybe_number.unwrap();
println!("The number is: {}", actual_number);

Some(value)에 대해 .unwrap()을 호출하면 내부 값을 반환합니다. 위의 예시에서 actual_number42가 되며, 더 이상 Option에 감싸여 있지 않습니다.

하지만 중대한 경고가 있습니다: None에 대해 .unwrap()을 호출하면 프로그램이 패닉(panic) 상태에 빠지고 즉시 종료됩니다. 이로 인해 .unwrap()OptionSome을 포함하고 있다는 것이 절대적으로 확실할 때만 사용해야 하는 잠재적으로 위험한 메서드가 됩니다.

let empty_option: Option<i32> = None;
let value = empty_option.unwrap(); // 여기서 패닉이 발생합니다!

.unwrap()은 드물게 사용해야 하며, 간단한 예제나 이미 .is_some()으로 확인한 경우와 같이 Option이 값을 포함하고 있음을 보장할 수 있는 상황에서만 사용하세요.

challenge icon

챌린지

쉬움

두 개의 입력을 받게 됩니다. 첫 번째 입력은 숫자(문자열 형태)이고, 두 번째 입력은 이 숫자를 유효한 것으로 처리할지 아니면 유효하지 않은 것으로 처리할지를 나타냅니다. 만약 두 번째 입력이 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(); // 여기서 패닉이 발생합니다!

OptionSome 값을 포함하고 있다는 것이 확실할 때만 .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]" 형식으로 출력하세요
    
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Logic & Flow의 모든 레슨