HashMap

HashDoS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋˜๋Š” ํ‘œ์ค€ ํ•ด์‹œ ๋งต์ž…๋‹ˆ๋‹ค:

use std::collections::HashMap;

fn main() {
    let mut page_counts = HashMap::new();
    page_counts.insert("ํ—ˆํด๋ฒ ๋ฆฌ ํ•€์˜ ๋ชจํ—˜".to_string(), 207);
    page_counts.insert("๊ทธ๋ฆผ ๋™ํ™”".to_string(), 751);
    page_counts.insert("์˜ค๋งŒ๊ณผ ํŽธ๊ฒฌ".to_string(), 303);

    if !page_counts.contains_key("๋ ˆ ๋ฏธ์ œ๋ผ๋ธ”") {
        println!(
            "{}์˜ ์ฑ…์€ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋ ˆ ๋ฏธ์ œ๋ผ๋ธ”์€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.",
            page_counts.len()
        );
    }

    for book in ["์˜ค๋งŒ๊ณผ ํŽธ๊ฒฌ", "์ด์ƒํ•œ ๋‚˜๋ผ์˜ ์•จ๋ฆฌ์Šค"] {
        match page_counts.get(book) {
            Some(count) => println!("{book}: {count}ํŽ˜์ด์ง€"),
            None => println!("{book}์„(๋ฅผ) ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."),
        }
    }

    // ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ .entry() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
    for book in ["์˜ค๋งŒ๊ณผ ํŽธ๊ฒฌ", "์ด์ƒํ•œ ๋‚˜๋ผ์˜ ์•จ๋ฆฌ์Šค"] {
        let page_count: &mut i32 = page_counts.entry(book.to_string()).or_insert(0);
        *page_count += 1;
    }

    println!("{page_counts:#?}");
}
This slide should take about 10 minutes.
  • HashMap์€ prelude์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š”. ์ฒซ ๋ฌธ์žฅ์—์„œ๋Š” ํ•ด์‹œ๋งต์— ์ฑ…์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜์—ฌ, ์—†์œผ๋ฉด ๋””ํดํŠธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘๋ฒˆ ์งธ ๋ฌธ์žฅ์—์„œ๋Š” ํ•ด์‹œ๋งต์— ํ•ด๋‹น ์ฑ…์ด ์—†๋Š” ๊ฒฝ์šฐ, ์ง€์ •ํ•œ ๊ฐ’์„ ํ•ด์‹œ๋งต์— ์ถ”๊ฐ€ํ•œ ๋’ค ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    let pc1 = page_counts
        .get("ํ•ด๋ฆฌ ํฌํ„ฐ์™€ ๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ")
        .unwrap_or(&336);
    let pc2 = page_counts
        .entry("ํ—๊ฑฐ๊ฒŒ์ž„".to_string())
        .or_insert(374);
  • ์•ˆํƒ€๊น์ง€๋งŒ hashmap!๊ฐ™์€ ๋งคํฌ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    • ๋Ÿฌ์ŠคํŠธ 1.56๋ถ€ํ„ฐ๋Š” HashMap์ด From<[(K, V); N]>์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ•ด์‹œ๋งต์„ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

      let page_counts = HashMap::from([
        ("ํ•ด๋ฆฌ ํฌํ„ฐ์™€ ๋งˆ๋ฒ•์‚ฌ์˜ ๋Œ".to_string(), 336),
        ("ํ—๊ฑฐ๊ฒŒ์ž„".to_string(), 374),
      ]);
  • ํ‚ค-๊ฐ’ ์Œ์— ๋Œ€ํ•œ Iterator๋กœ ํ•ด์‹œ๋งต์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” ํŽธ์˜์ƒ ํ•ด์‹œ๋งต์˜ ํ‚ค๋กœ &str๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ปฌ๋ ‰์…˜์— ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋นŒ๋ฆผ ๊ฒ€์‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•ด ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ to_string()์„ ์—†์• ๋„ ์ปดํŒŒ์ผ์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์–ด๋–ค ๋ฌธ์ œ์— ๋ถ€๋”ชํž๊นŒ์š”?
  • ํ•ด์‹œ๋งต์˜ ๋ช‡ ๋ช‡ ๋ฉ”์„œ๋“œ๋Š” ํ•ด์‹œ๋งต ๋‚ด๋ถ€์˜ ํŠน๋ณ„ํ•œ ํƒ€์ž…(์˜ˆ๋ฅผ ๋“ค์–ด std::collections::hash_map::Keys)๋“ค์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒ€์ž…๋“ค์€ Rust ๋ฌธ์„œ์—์„œ๋„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๊ฐ•์ƒ๋“ค์—๊ฒŒ ์ด ํƒ€์ž…๋“ค์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ์ด ๋ฌธ์„œ์— keys ๋ฉ”์„œ๋“œ๋กœ์˜ ์—ญ ๋งํฌ๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ์„ธ์š”.