Rust의 함수 결과 처리 1 - Option

mohadang·2022년 12월 4일
0

Rust

목록 보기
2/30
post-thumbnail

전통적인 언어의 null 처리

void add_one(int* ptr) {
  if (ptr == NULL) {
    return
  }

  int data = 12;
  printf("%d", *ptr + 12);
}

ptr이 null이든 null이 아니든 값이 있는것 처럼 사용할 수 있으며 런타임에 문제가 발생한다.

Rust 언어의 None 처리

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

fn add_one(value: Option<i32>) -> Option<i32> {
    match value {
        None => None,
        Some(i) => Some(i + 1)
    }
}

match 키워드를 사용해서 값이 있는 경우에 대해서 처리 하도록 한다.
즉 개발자가 언어 상으로 반드시 None에 대한 처리를 하도록 강제한다.
그렇지 않고 전통적인 언어처럼 사용하려고 하면 다음과 같이 문제가 발생

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

let sum = x + y; // error[E0277]: cannot add `std::option::Option<i8>` to `i8`

null vs None

중요한 차이점은 타입이다.
null의 경우 값이 있든 없든 같은 타입으로 표현이 가능하다

int* ptr = &data;
ptr = NULL;

많은 코드와 파일을 지나간 후 ...

*ptr = 100; // 확실히 하기 위해서는 NULL 체크를 해야하지만 개발자가 생략 할 수 있다.

None의 경우 값이 있는 경우에 대해서만 반드시 처리하도록 강제한다


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

많은 코드가 지나간 후 ...

let sum = data + 12i8;//error가 발생한다.

8 |     let sum = data + 12i8;
  |               ---- ^ ---- i8
profile
mohadang

0개의 댓글