Option<T> 이해하기 – null과 비교해서 쉽게 설명!Rust에는 null 값이 없다는 걸 알고 있지?
대신에 값이 있거나 없음을 표현하기 위해 Option<T>라는 열거형(enum)을 사용해.
null이 있는 언어 (예: C, Java, Python)C나 Java 같은 언어에서는 변수가 아무 값도 가지지 않을 때 null을 사용해.
String name = null; // 값이 없음을 의미
하지만 Rust에서는 null이 없고, 대신 Option<T>을 사용해.
Option<T>란?Option<T>은 값이 있을 수도 있고, 없을 수도 있음을 표현하는 열거형(enum)이야.
enum Option<T> {
Some(T), // 값이 있는 경우
None, // 값이 없는 경우
}
Some(T): 값이 있는 경우 None: 값이 없는 경우 (null처럼 동작) Option<T> 예제 – 값이 있을 수도 있고 없을 수도 있는 경우fn find_number(n: i32) -> Option<i32> {
if n > 0 {
Some(n * 2) // 값이 있으면 Some(값)
} else {
None // 값이 없으면 None
}
}
fn main() {
let result1 = find_number(10); // Some(20)
let result2 = find_number(-5); // None
println!("{:?}", result1); // 출력: Some(20)
println!("{:?}", result2); // 출력: None
}
🚀 설명:
find_number(10) → 양수이므로 Some(20)을 반환 find_number(-5) → 음수이므로 None을 반환 즉, 값이 있을 때만 Some(값), 없으면 None을 사용하는 거야.
None을 처리하는 방법Option<T> 타입은 그냥 사용할 수 없어.
값이 있을 때(Some)만 꺼내서 사용해야 해!
fn main() {
let number: Option<i32> = Some(5);
// match로 처리하기
match number {
Some(n) => println!("값: {}", n), // 값이 있을 때
None => println!("값이 없음"), // 값이 없을 때
}
}
✅ 출력:
값: 5
unwrap() – 값이 없으면 에러 발생fn main() {
let x: Option<i32> = Some(42);
let y: Option<i32> = None;
println!("{}", x.unwrap()); // 42
println!("{}", y.unwrap()); // 실행하면 에러 발생!
}
🚨 None.unwrap()을 하면 프로그램이 죽어버려! (panic 발생)
👉 안전하게 처리하려면?
matchunwrap_or(default 값) 사용fn main() {
let y: Option<i32> = None;
// 값이 없으면 기본값(0) 사용
let value = y.unwrap_or(0);
println!("{}", value); // 0
}
| 언어 | 값이 없음 표현 |
|---|---|
| C, Java, Python | null |
| Rust | None (Option 사용) |
Option<T> 핵심 포인트null이 없다! Option<T> 사용 Some(값) 또는 None match, unwrap_or()로 안전하게 다루기