Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

널 허용성(Nullability)

지금까지의 assigned_to 구현은 조금 거칠었습니다. ’할 일’이나 ‘완료’ 상태인 티켓에 대해 무조건 패닉을 일으키는 것은 그리 좋은 방법이 아니죠. 이때 Rust의 Option 타입을 활용하면 훨씬 세련되게 처리할 수 있습니다.

Option

Option은 값이 존재할 수도 있고 없을 수도 있는 **널 허용 값(Nullable value)**을 나타내는 Rust의 기본 타입입니다. 표준 라이브러리에는 다음과 같이 열거형으로 정의되어 있습니다.

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

Option은 값이 있으면 Some(T), 없으면 None이라는 정보를 명확하게 담고 있습니다. 또한 Rust는 개발자가 두 가지 경우를 모두 명시적으로 처리하도록 강제합니다. 만약 None인 경우를 깜빡하고 처리하지 않으면 컴파일 에러가 발생하죠. 이는 ‘암시적으로’ 널을 허용하는 다른 언어들에 비해 엄청난 장점입니다. 널 체크를 잊어서 발생하는 런타임 에러를 사전에 방지할 수 있기 때문입니다.

Option의 정의 살펴보기

Option의 정의를 보면 이전에 보지 못했던 새로운 구문이 등장합니다. 바로 **튜플 형태의 베리언트(Tuple-like variants)**입니다.

튜플 형태의 베리언트(Tuple-like variants)

Option에는 Some(T)None이라는 두 베리언트가 있습니다. 여기서 Some이름 없는 필드를 가지는 튜플 형태의 베리언트입니다.

이런 형태는 필드가 하나뿐이거나, Option처럼 무언가를 감싸는 ‘래퍼(Wrapper)’ 타입에서 자주 사용됩니다.

튜플 형태의 구조체(Tuple-like structs)

열거형뿐만 아니라 구조체도 튜플 형태로 정의할 수 있습니다.

struct Point(i32, i32);

이렇게 정의한 Point 인스턴스의 필드에는 인덱스를 사용해 접근할 수 있습니다.

let point = Point(3, 4);
let x = point.0;
let y = point.1;

튜플(Tuples)

방금 ’튜플 형태’라는 말을 썼는데, 정작 튜플이 무엇인지 아직 배우지 않았네요! 튜플은 여러 가지 타입의 값들을 하나의 단위로 묶어주는 Rust의 기본 타입입니다.

// 같은 타입의 값 두 개를 묶은 튜플 let first: (i32, i32) = (3, 4);
// 서로 다른 타입의 값 세 개를 묶은 튜플 let second: (i32, u32, u8) = (-42, 3, 8);

문법은 아주 간단합니다. 괄호 안에 값의 타입들을 쉼표로 구분해 적어주면 됩니다. 각 값에 접근할 때는 점(.) 표기법과 인덱스를 사용합니다.

assert_eq!(second.0, -42);
assert_eq!(second.1, 3);
assert_eq!(second.2, 8);

튜플은 굳이 전용 구조체 타입을 따로 정의하기에는 번거로운, 간단한 데이터 묶음을 만들 때 매우 유용합니다.

Exercise

The exercise for this section is located in 05_ticket_v2/05_nullability