프로그래밍/Rust

[Rust] Option<T>가 Null보다 나은 이유(번역)

Lou Park 2023. 5. 20. 12:58

Null의 문제점

Rust에는 다른 많은 프로그래밍 언어에서 있는 Null이 없다. Null은 값이 없음을 의미하는 값이다. Null이 있는 언어에서, 변수는 항상 Null, 또는 Not-null 두가지 상태 중 하나에 있다.

 

Null의 발명자인 Tony Hoare는 2009년 발표 "Null References: The Billion Dollar Mistake"에서 이렇게 얘기했다:

"나는 그것을 10억 달러짜리 실수라고 부릅니다. 그 당시 저는 객체 지향 언어에서 참조에 대한 최초의 포괄적인 타입 시스템을 설계하고 있었습니다. 모든 참조의 사용이 컴파일러에 의해 자동으로 검사되도록 보장하는 것이 목표였습니다. 하지만 null 참조를 넣는 유혹을 이기지 못했습니다. 구현하기가 너무 쉽기 때문입니다. 이것은 수많은 오류, 취약성, 시스템 충돌을 초래했으며, 지난 40년 동안 아마도 10억 달러의 고통과 손해를 초래했을 것입니다."

 

Null값의 문제는 Null값을 Null이 아닌 값으로 사용하려하면 오류가 발생한다는 것이다. Null 또는 Not-Null 속성이 널리 퍼져있기 때문에 이러한 종류의 오류를 쉽게 만들 수 있다.

 

 

Option<T> Emumerate

Option<T>는 표준 라이브러리에서 이렇게 정의된다.

enum Option<T> {
    None,
    Some(T),
}

Option<T> 열거형(Enum)에는 두 가지 값이있다. None 은 값이 존재하지 않음을 나타내고 Some(T)는 T라는 타입의 값이 존재함을 나타낸다. Option<T> 열거형은 null 값을 대체 할 수 있다. Option<T> 열거형을 사용하면 null 값을 사용할 때 발생하는 오류를 방지 할 수 있다.

주요 이점은 다음과 같다.
- null 값으로 인한 오류를 방지 할 수 있다.
- 코드가 더 안전하고 신뢰할 수 있다.
- 코드가 더 이해하기 쉽다.

 

 

어떻게 Option<T>가 Null보다 나을 수 있나?

Option<T>와 T는 서로 다른 타입이기 때문에 컴파일러는 Option<T> 값을 마치 유효한 값인 것처럼 사용할 수 없도록 한다. 

예를 들어 다음 코드는 컴파일되지 않는다.

    let x: i8 = 5;
    let y: Option<i8> = Some(5);

    let sum = x + y;
$ cargo run
   Compiling enums v0.1.0 (file:///projects/enums)
error[E0277]: cannot add `Option<i8>` to `i8`
 --> src/main.rs:5:17
  |
5 |     let sum = x + y;
  |                 ^ no implementation for `i8 + Option<i8>`
  |
  = help: the trait `Add<Option<i8>>` is not implemented for `i8`
  = help: the following other types implement trait `Add<Rhs>`:
            <&'a i8 as Add<i8>>
            <&i8 as Add<&i8>>
            <i8 as Add<&i8>>
            <i8 as Add>

For more information about this error, try `rustc --explain E0277`.
error: could not compile `enums` due to previous error

Rust 컴파일러는 i8과 Option<i8>을 더하는 방법을 모르기 때문에, 값을 사용하기 전에 해당 경우(Optional)를 먼저 처리하도록 한다. 이렇듯 값이 Null이 아님을 잘못 가정하는 위험을 제거하면 더욱 코드 신뢰도를 높일 수 있다. 

 

원문 https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html