rust에서의 열거형은 구조체와 비슷하게 선언 및 사용
스코프영역에 접근하는 :: 연산으로 접근하여 해당 열거형 타입과 값을 가져옴
사용방식을 보면 tuple 처럼 여러 인자를 받아서 사용가능한데 이를 tuple variant로 취급함.
enum의 tuple variant 형식은 패턴 메칭을 통해서만 값을 꺼낼 수 있음
열거형에도 impl 타입 {} 형식으로 함수 정의가 가능하다.
Option, 표준라이브러리에 정의된 enum 타입
rust에는 null 개념이 없기 때문에 Option을 사용, Option에는 값의 존재 여부를 파악가능한 값들이 들어있다.
Option의 코드
enum Option<T> {
None,
Some(T),
}
Option은 rust의 Prelude에 포함된 enum 타입으로 명시적으로 Option:: 을 붙이지 않고 None, Some을 바로 사용할 수 있다.
Prelude란 컴파일러가 자동으로 호출하는 표준라이브러리이다. 프로그래머는 필요시에 이 라이브러리에 작성하여 특정 타입을 명시적 호출없이 호출가능하게 만들 수 있다.
Option은 특정 함수의 반환값으로 자주 사용되며 해당 Option 타입의 제네릭 타입인 T 타입으로의 변환을 강제하기에 기존의 Null 값이 유발하는 런타임 오류들을 컴파일 타임에 찾아낼 수 있도록 만든다.
enum 타입은 앞서 말했듯이 패턴 매칭을 통해서 값을 사용할 수 있다. 이는 match 라는 제어 흐름 연산자로 수행 가능하다.
match는 들어온 enum 타입 값에 대하여 모든 내부 필드에 대한 처리를 행해야 한다. 즉, match는 철저해야한다.
하지만 i32같은 너무 광범위한 타입의 경우 _ 이라는 와일드 카드를 통해 필요한 몇가지만 처리하고 나머지를 처리하거나 아니면 변수명을 적고 해당 변수로 따로 처리하려는 값을 담아서 처리가능하다. (포괄패턴 및 와일드 카드)
match는 하나의 값만을 처리하기 위해서는 무조건 _ => () 를 마지막에 작성하여 나머지 값들에 대한 처리를 진행해줘야하는 번거로움이 있다.
이러한 번거로움을 해결해주는 문법으로 if let 이 있다.
Before, 패턴매칭을 통한 분해로 값의 분해가 자연스럽게 이뤄진다.
let config_max = Some(3u8);
match config_max {
Some(max) => println!("The maximum is configured to be {}", max),
_ => (),
}
After, 패턴매칭을 통한 분해로 값의 분해가 자연스럽게 이뤄진다.
let config_max = Some(3u8);
if let Some(max) = config_max {
println!("The maximum is configured to be {}", max);
}
enum 관련 예시 코드
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
#[derive(Debug)] // so we can inspect the state in a minute
enum UsState {
Alabama,
Alaska,
// --생략--
}
enum Coin {
Penny,
Nickel,
Dime,
Quarter(UsState),
}
fn value_in_cents(coin: Coin) -> u8 {
match coin {
Coin::Penny => {
println!("Lucky penny!");
1
}
Coin::Nickel => 5,
Coin::Dime => 10,
Coin::Quarter(state) =>{
println!("State quarter from {:?}!", state);
25
}
}
}
fn main() {
let some_number = Some(5);
let some_char = Some('e');
let absent_number: Option<i32> = None;
let coin = Coin::Dime;
let coin_qs = Coin::Quarter(UsState::Alaska);
let coin = value_in_cents(coin);
println!("{coin}");
}'Rust' 카테고리의 다른 글
| 트레이트, 라이프타임 (0) | 2026.01.12 |
|---|---|
| 모듈시스템 (0) | 2026.01.08 |
| 구조체 (struct), 약간의 메크로 얘기 (0) | 2026.01.05 |
| 소유권 (Ownership) (0) | 2026.01.04 |
| 조건, 반복문 (0) | 2026.01.04 |