Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

해시맵

벡터가 정수 인덱스로 값을 저장하는 반면, HashMap은 키(key)로 값을 저장합니다. HashMap의 키는 불리언, 정수, 문자열 또는 EqHash 트레이트를 구현하는 임의의 다른 타입이 될 수 있습니다. 이에 대해서는 다음 섹션에서 자세히 다룹니다.

벡터와 마찬가지로 HashMap은 늘어날 수 있지만, 공간이 남을 때는 스스로 줄어들 수도 있습니다. HashMap::with_capacity(uint)를 사용하여 특정 시작 용량으로 HashMap을 생성하거나, HashMap::new()를 사용하여 기본 초기 용량을 가진 HashMap을 얻을 수 있습니다(권장됨).

use std::collections::HashMap;

fn call(number: &str) -> &str {
    match number {
        "798-1364" => "죄송합니다, 전화 연결을 할 수 없습니다.
            전화를 끊고 다시 시도해 주세요.",
        "645-7689" => "안녕하세요, 어썸 피자입니다. 저는 프레드라고 합니다.
            오늘 무엇을 도와드릴까요?",
        _ => "안녕! 누구시더라?"
    }
}

fn main() {
    let mut contacts = HashMap::new();

    contacts.insert("다니엘", "798-1364");
    contacts.insert("애슐리", "645-7689");
    contacts.insert("케이티", "435-8291");
    contacts.insert("로버트", "956-1745");

    // 참조를 인자로 받아 `Option<&V>`를 반환합니다
    match contacts.get(&"다니엘") {
        Some(&number) => println!("다니엘에게 전화 거는 중: {}", call(number)),
        _ => println!("다니엘의 번호가 없습니다."),
    }

    // `HashMap::insert()`는 삽입된 값이 새로운 것이면 `None`을,
    // 그렇지 않으면 `Some(value)`를 반환합니다
    contacts.insert("다니엘", "164-6743");

    match contacts.get(&"애슐리") {
        Some(&number) => println!("애슐리에게 전화 거는 중: {}", call(number)),
        _ => println!("애슐리의 번호가 없습니다."),
    }

    contacts.remove(&"애슐리");

    // `HashMap::iter()`는 (&'a key, &'a value) 쌍을
    // 임의의 순서로 내놓는 이터레이터를 반환합니다.
    for (contact, &number) in contacts.iter() {
        println!("{}에게 전화 거는 중: {}", contact, call(number));
    }
}

해싱과 해시 맵(때때로 해시 테이블이라고도 불림)이 어떻게 작동하는지에 대한 더 자세한 정보는 Wikipedia의 해시 테이블을 참조하세요.