Option<T>


러스트에는 기본적으로 null 이 없음. 때문에 널포인터 참조와 같은 에러는 발생하지 않음. 하지만, '값이 없음'을 표현하는 방법이 필요할 때가 있음. 그럴 때 Option<T> 이라는 enum 타입을 사용할 수 있음.


Option<T> 은 표준 라이브러리에 아래와 같이 정의되어 있음


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

T 는 제너릭.


Some 은 값이 있음을 나타내며, None 은 값이 없음을 나타냄. 이 두 '상태' 를 가지고 null 체크와 같은 일을 수행할 수 있음. Option 은 기본적으로 스코프에 포함되어, 명시적으로 로드하지 않아도 사용할 수 있음.


Option<T> 은 아래와 같이 선언됨.


let some_number = Some(5);
let some_string = Some("a string");

let absent_number: Option<i32> = None;


타입 추론에 따라 some_number 는 Option<i32> 타입, some_string 은 Option<&str> 이 됨. 그런데 absent_number 에만 타입을 지정한 이유는, None 은 값을 가지지 않기 때문에 타입을 지정하지 않으면 absent_number 의 타입을 추론할 수 없어 컴파일 에러가 발생함. 때문에 None 은 타입이 필요함.


말했듯이, Some 은 값이 있는 상태를, None 은 null 을 의미함. 하지만, 그렇다고 해서 Some 을 값 자체로 사용할 수는 없음. Some 은 어쨌든 Option 이라는 enum 타입일 뿐임. 아래와 같은 연산은 컴파일 에러를 일으킴. 인티저 타입에 Option 타입을 더할 수는 없기 때문. Some 이 값이 아니라는 걸 기억해야 함.


let x = 5;
let y = Some(5);

let sum = x + y;


5 라는 값이 있을 때, 이 값은 분명히 존재하는 값이며, 러스트는 이 값이 유효한 값인지 아닌지 체크할 필요가 없음. 그런데 Option 타입의 경우, 값이 존재할 수도(Some), 존재하지 않을 수도(None) 있음. 때문에 Option 을 사용하기 위해서는 먼저 이게 Some 인지 None 인지 체크할 필요가 있음. 그리고 우리는 Some 일 경우의 동작과, None 일 경우의 동작을 모두 코드로 작성할 수 있음. 이는 match 를 이용함.




'Rust' 카테고리의 다른 글

Enum(if let)  (0) 2018.02.21
Enum(match)  (0) 2018.02.21
Enum  (0) 2018.02.21
구조체(메서드)  (0) 2018.02.20
구조체(활용)  (0) 2018.02.20

+ Recent posts