학습
Rust 고급 컬렉션
Rust 고급 컬렉션 — 고급
고급 컬렉션
1. 도입 (왜 배워야 하는가)
Rust에서 고급 컬렉션은 데이터 구조를 효율적으로 관리하고 조작하는 데 필수적입니다. 실무에서는 다양한 형태의 데이터를 다루게 되며, 이를 위해 적절한 컬렉션을 선택하는 것이 중요합니다. 예를 들어, 웹 애플리케이션에서는 사용자 정보를 배열로 저장할 수도 있지만, 중복된 사용자 정보를 허용하지 않으려면 해시셋이 필요합니다.
고급 컬렉션을 이해하지 못하면 데이터 처리의 비효율성, 중복 데이터 문제, 메모리 낭비 등의 문제가 발생할 수 있습니다. 제대로 된 컬렉션을 사용하지 않으면 코드 유지보수 또한 어려워지게 됩니다.
2. 핵심 개념 설명
2.1 벡터 (Vec)
벡터는 동적 배열로, 크기가 가변적인 데이터 구조입니다. 필요에 따라 크기를 늘리거나 줄일 수 있어 유연하게 사용할 수 있습니다. 마치 쇼핑몰의 장바구니처럼, 필요할 때마다 아이템을 추가하거나 제거할 수 있습니다.
2.2 해시맵 (HashMap)
해시맵은 키-값 쌍으로 데이터를 저장하는 자료구조입니다. 키를 통해 값에 빠르게 접근할 수 있습니다. 예를 들어, 전화번호부에서 이름으로 번호를 찾는 것과 비슷합니다.
2.3 해시셋 (HashSet)
해시셋은 중복을 허용하지 않는 컬렉션으로, 고유한 값만 저장할 수 있습니다. 친구 목록에서 같은 친구를 중복해서 추가하지 않는 것과 비슷합니다.
| 컬렉션 타입 | 특징 | 사용 예시 |
|---|---|---|
| Vec | 가변 길이, 순서가 있는 컬렉션 | 장바구니에 아이템 추가/삭제 |
| HashMap | 키-값 쌍, 빠른 검색 | 전화번호부에서 이름으로 전화번호 찾기 |
| HashSet | 중복 불허, 고유한 값 저장 | 친구 목록 관리 |
3. 기본 코드 예제
벡터 사용 예제
fn main() {
let mut shopping_cart: Vec<&str> = Vec::new(); // 빈 벡터 생성
shopping_cart.push("사과"); // 벡터에 "사과" 추가
shopping_cart.push("바나나"); // 벡터에 "바나나" 추가
for item in &shopping_cart { // 벡터의 모든 아이템을 순회
println!("{}", item); // 각 아이템 출력
}
}
실행 결과
사과
바나나
let mut shopping_cart: Vec<&str> = Vec::new();: 빈 문자열 벡터를 생성합니다.shopping_cart.push("사과");: 벡터에 "사과"를 추가합니다.for item in &shopping_cart {...}: 벡터에 있는 모든 아이템을 순회합니다.println!("{}", item);: 각 아이템을 출력합니다.
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니를 구현할 때
use std::collections::HashMap;
fn main() {
let mut cart: HashMap<&str, i32> = HashMap::new(); // 상품명과 수량을 저장할 해시맵 생성
cart.insert("사과", 3); // 사과 3개 추가
cart.insert("바나나", 2); // 바나나 2개 추가
for (item, quantity) in &cart { // 해시맵의 모든 아이템과 수량을 순회
println!("{}: {}개", item, quantity); // 각 아이템과 수량 출력
}
}
상황 설명: 쇼핑몰에서 고객이 장바구니에 추가한 상품과 수량을 관리합니다.
예제 2: 중복을 허용하지 않는 친구 목록
use std::collections::HashSet;
fn main() {
let mut friends: HashSet<&str> = HashSet::new(); // 친구 목록을 저장할 해시셋 생성
friends.insert("홍길동"); // 친구 추가
friends.insert("김영희"); // 친구 추가
friends.insert("홍길동"); // 중복된 친구 추가 시도
for friend in &friends { // 해시셋의 모든 친구를 순회
println!("{}", friend); // 각 친구 출력
}
}
상황 설명: 친구 목록에 중복된 친구가 추가되지 않도록 관리합니다.
5. 흔한 실수와 주의사항
실수 1: 벡터의 인덱스 범위 초과
let v = vec![1, 2, 3];
println!("{}", v[3]); // 오류 발생: 인덱스 초과
올바른 코드
let v = vec![1, 2, 3];
println!("{}", v[2]); // 정상 동작: 3 출력
실수 2: 해시셋에 중복된 값 추가
let mut s = HashSet::new();
s.insert("apple");
s.insert("apple"); // 중복 추가, 무시됨
올바른 코드
let mut s = HashSet::new();
s.insert("apple");
s.insert("banana"); // 추가됨