IMCAT.DEV
로그인 가입
Rust 고급 자료구조

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"); // 추가됨

    6. 정리

  • Rust의 고급 컬렉션은 데이터 관리를 효율적으로 돕습니다.
  • 벡터, 해시맵, 해시셋의 용도와 사용법을 이해해야 합니다.
  • 실무에서의 활용은 데이터 처리와 중복 관리에서 큰 차이를 만듭니다.
  • 다음에 학습하면 좋은 주제는 Rust의 메모리 관리와 소유권 시스템입니다.