[Rust]

[Rust] 열거형(enum)

극꼼 2023. 8. 1. 23:10
반응형


<열거형>

열거형은 코드에서 다음과 같이 정의할 수 있습니다.

enum ItemType {
    None,
    Food,
    Book,
}

None, Food, Book처럼 열거된 것들을 열거형의 variants라 부릅니다.

 

열거형의 variants에 대한 인스턴스를 만드는 방법은 다음과 같습니다.

let food = ItemType::Food;
let book = ItemType::Book;

 

지난 챕터에 배운 struct에 열거형을 다음과 같이 사용할 수 있는데요,

struct Item{
    itemType: ItemType,
    name: String,
}
let pizza = Item {
    itemType: ItemType::Food,
    name: String::from("pizza");
}

 

위와 같이 struct를 사용하지 않고, 각 열거형 variant에 직접 데이터를 입력해서 동일한 개념을 표현할 수 있습니다. 이 때 특이한 점은 variant끼리 타입이 같지 않아도 된다는 점입니다.

enum ItemType {
    None,
    Food(String),
    Book(String, u8),
}
let pizza = ItemType::Food(String::from("pizza"));
let myBooks = ItemType::Book(String::from("books"), 8);

 

IP 주소와 그 종류를 저장하는 표준 라이브러리에서 IpAddr을 이와 같은 방식으로 정의하고 있습니다. 위에서 간단하게 들었던 예시에서 좀 더 복잡해졌는데, 각 variant마다 주소 데이터가 다른 구조체로 정의되어 있습니다.

struct Ipv4Addr {
    // details elided
}

struct Ipv6Addr {
    // details elided
}

enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}

 

구조체에서 impl을 사용해 메서드를 정의했던 것처럼 열거형에서도 똑같이 메서드를 정의할 수 있습니다.

impl ItemType {
    fn do_something(&self){
        //메서드 내용 정의
    }
}

<Option 열거형>

: 표준 라이브러리에 있는 매우 흔하게 사용되고 있는 열거형입니다. 러스트에는 null이 없는데, Option 타입은 값이 있거나 없을 수 있는 상황을 나타내기 때문에 많이 사용됩니다. 이 개념을 타입 시스템의 관점에서 표현하면, 컴파일러가 발생할 수 있는 모든 경우를 처리했는지 체크할 수 있습니다.

다음과 같이 Some이 아닌 None을 사용하면 Option<T>이 어떤 타입을 가질지 러스트에게 알려줄 필요가 없습니다. 

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

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

let absent_number: Option<i32> = None;

 

아래 예시 코드에서 x와 y는 서로 타입이 달라서 연산할 수 없습니다.

x 변수와 같은 경우는 항상 유효한 값을 가지고 있음을 보장하는데, y 의 경우에는 값을 사용하기 전에 패턴 매칭으로 null 케이스를 처리해서 데이터에 안전하게 접근해야 합니다. 이 부분은 다음 장에서 배울 match 표현식에서 알아볼 예정입니다.

let x: i8 = 5;
let y: Option<i8> = Some(5);
let sum = x + y; // 에러 : error[E0277]: cannot add `Option<i8>` to `i8`

요약 참조 링크 : https://rinthel.github.io/rust-lang-book-ko/ch06-01-defining-an-enum.html

반응형

'[Rust]' 카테고리의 다른 글

[Rust] 컬렉션(Collection)  (0) 2023.08.14
[Rust] 패키지, 크레이트, 모듈로 프로젝트 관리  (0) 2023.08.11
[Rust] 구조체 - 메서드  (0) 2023.07.30
[Rust] 데이터 구조체  (0) 2023.07.29
[Rust] 슬라이스(slices)  (0) 2023.07.27