반응형
아래 코드는 랜덤으로 날씨를 선택하고 패턴 매칭으로 해당하는 문자열을 출력하는 코드 입니다.
use rand::Rng;
fn main () {
enum Weather {
Sunny,
Ranny,
Snowy {cm:u32}
}
let weather_list = vec![Weather::Sunny, Weather::Ranny, Weather::Snowy { cm: 5 }];
let random_number = rand::thread_rng().gen_range(0..3);
match &weather_list[random_number] {
Weather::Ranny => println!("Ranny!"),
Weather::Snowy { cm } => println!("Snowy {}cm",cm),
Weather::Sunny => println!("Sunny")
}
}
Weather 이라는 enum ( 열거형 ) 선택 가능한 날짜를 정의하고 이를 랜덤으로 뽑습니다. 이후 match를 활용하여 해당하는 값에 맞게 문자열을 출력 합니다.
근데 사실 이런 코드는 열거형이 아닌 구조체로도 구현 가능합니다.
아래 코드를 보면 Sunny와 Ranny에서는 사용하지 않는 cm가 있습니다.
물론 맥락상 cm가 뭘 의미하는지 각 필드 입장에서 이해는 됩니다만 실제로는 이 필드를 사용하지 않는다고 가정해봅시다.
use rand::Rng;
fn main() {
struct Weather {
weather_type: String,
cm: u32
}
let weather_list = vec![
Weather {
weather_type: String::from("Sunny"),
cm: 0,
},
Weather {
weather_type: String::from("Ranny"),
cm: 0,
},
Weather {
weather_type: String::from("Snowy"),
cm: 5,
},
];
let random_number = rand::thread_rng().gen_range(0..3);
match weather_list[random_number].weather_type.as_str() {
"Sunny" => println!("Sunny!"),
"Ranny" => println!("Ranny!"),
"Snowy" => println!("Snowy {}cm", weather_list[random_number].cm),
_ => println!("Unknown weather!"),
}
}
사용하지 않기 때문에 cm라는 필드에 0이라는 값을 할당해줘야 합니다. 이는 다른 개발자가 봤을 때 무슨 의미인지 이해하기 어려울 수 있습니다. Sunny, 혹은 Ranny인데 cm가 0이라는 의미가 뭔지 여러번 고민해봐야 할 수도 있습니다.
이처럼 구조체는 인스턴스에 대해 같은 필드를 가지도록 합니다. 사용하지 않는 필드라도 어쩔 수 없이 처리해줘야 합니다,
이는 메모리 낭비로 이어질 수도 있고, 코드를 더욱 복잡하게 만들 가능성도 있습니다. 가장 큰 문제로는 타입 안정성 입니다.
String으로만 타입을 제한하고 있어서 각 날씨에 대한 오타를 잡아줄 방법이 없습니다. 당연히 자동완성도 안됩니다.
구조가 런타임에서 딱히 변할 필요가 없고 새로운 필드 추가도 필요 없다면 열거형이 더 나은 선택 입니다.
반응형
'Rust' 카테고리의 다른 글
Rust 기본개념 - 패키지, 모듈관리 (1) | 2024.12.09 |
---|---|
Rust 기본개념 - 패턴매칭 match (0) | 2024.12.09 |
Rust 기본개념 - 열거형 (0) | 2024.12.08 |
Rust 기본개념 - 메서드 (0) | 2024.12.07 |
Rust 기본 개념 - 구조체 (2) | 2024.12.07 |