C.W.K.
Stream
Lesson 02 of 06 · published

Option — null 아닌 null

~12 min · enums, option, null, safety

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

Tony Hoare 는 null 참조를 자기 '10억 달러짜리 실수' 라고 불렀어 — 수십 년의 크래시, 보안 구멍, 새벽 3시 호출, 다 거기 있다고 주장하는데 없는 값 하나에서. Rust 엔 null 이 그냥 없어. 그 자리에: Option.

부재를 타입으로

Option<T> 는 variant 둘짜리 enum 이야: Some(T) (값 존재) 와 None (여기 아무것도). '없을 수도 있음' 이 타입의 일부가 돼. 결과를 못 찾을 수 있는 함수는 Option<T> 를 반환하고, 호출자는 None 경우를 먼저 다루지 않고선 안쪽 값을 써. 컴파일러가 부재를 빠져나가게 안 둬.

상자를 열어야 해

Option 을 안쪽 값인 척 실수로 못 써 — 둘은 다른 타입이야. T 에 닿으려면 match 하거나, if let 을 쓰거나, unwrap_or 같은 메서드를 불러. 'null 체크 까먹음' 버그가 사라졌어: 타입 시스템이 체크를 필수로 만들어.

null 이 없으면 null 포인터 예외도 없어 — safe Rust 에선 영원히. '거기 있어야 했는데' 크래시 부류 전체가 줄어든 게 아니라 사라졌어. 부재를 일어나는 자리에서 딱 한 번 처리하고, 컴파일러가 안 까먹었다고 증명해.

unwrap: 장전된 총

.unwrap() 은 값을 꺼내지만 None 이면 panic 해. 예제랑 테스트엔 괜찮아; 실전 코드에선 '이건 Some 이라고 확신해, 틀리면 크래시' 라는 의도적 선언이야. unwrap_or, unwrap_or_else, map, 또는 match 를 선호해 — 값이 없을 때 뭐가 일어날지 말하게 만들지, 크래시 안 하고.

Code

Option 은 '없을 수도' 를 명시한다·rust
fn find_even(nums: &[i32]) -> Option<i32> {
    for &n in nums {
        if n % 2 == 0 {
            return Some(n); // 하나 찾음
        }
    }
    None // 아무것도 안 맞음 — 그리고 타입이 그렇다고 말해줘
}

fn main() {
    let data = [1, 3, 5, 8, 9];
    match find_even(&data) {
        Some(n) => println!("first even: {n}"),
        None => println!("no evens"),
    }
    // panic 대신 안전한 기본값:
    let first = find_even(&[1, 3]).unwrap_or(-1);
    println!("{first}");
}

External links

Exercise

첫 글자를 반환하거나 빈 문자열엔 None 을 반환하는 fn first_char(s: &str) -> Option<char> 를 써봐. 보통 문자열이랑 빈 문자열에 불러서 둘 다 match 로 처리해. 그다음 호출을 unwrap_or('?') 로 다시 써. 각 스타일을 언제 선호해?
Hint
match 는 두 경우 다 진짜 처리가 필요할 때 맞고; unwrap_or 는 합리적 기본값이 None 경우를 덮을 때 맞아. 어느 쪽도 None 을 무시 못 해 — 그게 핵심이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.