[Rust Guide] 8.2. 벡터와 Enum 응용
Source: Dev.to
![Cover image for [Rust Guide] 8.2. Vector and Enum Applications](https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftc4bvty1v03ggbb4v627.png)
8.2.0. Chapter Overview
Chapter 8은 주로 Rust에서 흔히 사용되는 컬렉션에 대해 다룹니다. Rust는 다양한 컬렉션‑유사 데이터 구조를 제공하며, 이러한 컬렉션은 여러 값을 담을 수 있습니다. 하지만 Chapter 8에서 다루는 컬렉션은 배열과 튜플과는 다릅니다.
Chapter 8의 컬렉션은 스택이 아니라 힙에 저장됩니다. 이는 컴파일 타임에 크기를 알 필요가 없으며, 런타임에 동적으로 성장하거나 축소될 수 있음을 의미합니다.
이 장에서는 세 가지 컬렉션에 초점을 맞춥니다: Vector, String, 그리고 HashMap.
8.2.1. How Vector and Enum Complement Each Other
Vector는 동적으로 크기가 변할 수 있지만, 모든 요소는 여전히 같은 데이터 타입이어야 합니다. 힙에 서로 다른 타입의 데이터를 저장해야 할 때는 enum을 사용할 수 있습니다.
Enum 변형은 첨부 데이터를 가질 수 있으며, 그 데이터는 서로 다른 타입일 수 있습니다. 가장 중요한 점은 모든 변형이 동일한 enum 타입에 속한다는 것입니다. 즉, 모든 변형이 같은 타입이므로 Vector에 저장할 수 있습니다.
이를 통해 enum을 사용해 Vector 안에 서로 다른 데이터 타입을 저장할 수 있게 됩니다.
8.2.2. Vector + enum
Vector와 enum을 함께 사용하는 실용적인 예시:
enum SpreadSheetCell {
Int(i32),
Float(f64),
Text(String),
}
fn main() {
let row = vec![
SpreadSheetCell::Int(5567),
SpreadSheetCell::Text("up up".to_string()),
SpreadSheetCell::Float(114.514),
];
}이 예시는 Excel 셀의 동작을 시뮬레이션합니다. 셀은 다음 중 하나만 저장할 수 있습니다: 정수, 부동소수점 숫자, 혹은 문자열. 따라서 SpreadSheetCell enum을 Int, Float, Text 세 변형으로 정의했습니다.
main에서 변수 row는 한 행의 셀들을 담고 있습니다. 행에 들어가는 셀 수는 고정되어 있지 않으므로 Vector를 사용해 저장합니다. 벡터는 세 개의 셀로 초기화됩니다: 정수(5567), 문자열("up up"), 그리고 부동소수점 숫자(114.514).
데이터를 담을 수 있는 enum을 사용함으로써, 우리는 간접적으로 서로 다른 데이터 타입을 Vector에 저장할 수 있습니다.
Rust는 Vector의 요소 타입을 컴파일 타임에 알아야 힙 메모리를 얼마나 할당할지 결정하고, 모든 요소에 대해 일괄 연산이 유효한지 확인할 수 있습니다. enum과 match 표현식을 함께 사용하면 Rust가 모든 가능한 경우를 컴파일 타임에 알게 되어 런타임에 올바르게 처리할 수 있습니다.
가능한 데이터 타입 집합이 완전하다면 enum이 작동합니다. 무한히 많은 가능성이나 비완전한 집합의 경우에는 트레이트가 필요하며, 이는 이후 장에서 다룰 주제입니다.