0Pricing
Learn Rust Coding · 강의

Entry API와 기본값

값을 편리하게 갱신해 보세요.

Entry API와 기본값은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

Entry API를 사용하는 이유

키가 있으면 값을 업데이트하고, 없으면 기본값을 삽입하고 싶은 경우가 많습니다.

get과 insert를 함께 사용하면 번거롭습니다. entry API를 사용하면 한 단계로 깔끔하게 처리할 수 있습니다.

<code>entry</code>는 슬롯을 반환합니다

entry(key)를 호출하면 맵에서 해당 키가 들어갈 위치를 가리키는 핸들을 얻습니다.

이 핸들을 통해 기본값으로 채울지, 현재 들어 있는 값을 수정할지 결정할 수 있습니다.

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<&str, i32> = HashMap::new();
    m.entry("a").or_insert(0);
    println!("{}", m["a"]);
}

or_insert

or_insert(default)는 키가 없을 때만 기본값을 삽입한 다음 값에 대한 가변 참조를 반환합니다.

키가 이미 있으면 기본값은 무시되고 기존 값을 얻습니다.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("a", 10);
    m.entry("a").or_insert(99);
    m.entry("b").or_insert(99);
    println!("a={}, b={}", m["a"], m["b"]);
}

참조를 통해 값 변경하기

or_insert는 가변 참조를 반환하므로 값을 즉시 변경할 수 있습니다.

*로 역참조하면 제자리에서 업데이트할 수 있습니다. 이것이 개수 세기의 핵심입니다.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    let count = m.entry("hits").or_insert(0);
    *count += 1;
    *count += 1;
    println!("hits = {}", m["hits"]);
}

반복문에서 개수 세기

대표적인 방식은 다음과 같습니다. 각 항목의 슬롯을 가져오고, 기본값을 0으로 설정한 뒤 증가시킵니다.

항목마다 한 줄의 로직만으로 발생 횟수를 집계할 수 있습니다.

use std::collections::HashMap;

fn main() {
    let mut counts = HashMap::new();
    for c in "hello".chars() {
        *counts.entry(c).or_insert(0) += 1;
    }
    println!("l appears {} times", counts[&'l']);
}

or_insert_with

기본값을 만드는 비용이 클 때는 or_insert_with를 사용하세요. 키가 없을 때만 실행되는 클로저를 전달합니다.

실제로 필요하지 않을 수도 있는 값을 미리 만드는 일을 피할 수 있습니다.

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<&str, Vec<i32>> = HashMap::new();
    m.entry("nums").or_insert_with(Vec::new).push(1);
    m.entry("nums").or_insert_with(Vec::new).push(2);
    println!("{:?}", m["nums"]);
}

and_modify

and_modify는 키가 이미 있을 때만 해당 값에 클로저를 실행합니다.

or_insert와 연결하면 두 경우를 모두 처리할 수 있습니다. 키가 있으면 수정하고, 없으면 시작 값을 삽입합니다.

use std::collections::HashMap;

fn main() {
    let mut m = HashMap::new();
    m.insert("x", 5);
    m.entry("x").and_modify(|v| *v += 10).or_insert(0);
    m.entry("y").and_modify(|v| *v += 10).or_insert(1);
    println!("x={}, y={}", m["x"], m["y"]);
}

or_default

값의 타입에 Default가 구현되어 있다면(정수의 0이나 빈 Vec처럼) or_default가 이를 사용합니다.

or_insert(Default::default())를 줄여 쓴 표현입니다.

use std::collections::HashMap;

fn main() {
    let mut m: HashMap<&str, i32> = HashMap::new();
    *m.entry("score").or_default() += 7;
    println!("score = {}", m["score"]);
}

키별 목록 만들기

항목을 벡터로 그룹화할 때 entry API가 특히 유용합니다.

각 키에 대해 처음에는 빈 Vec을 기본값으로 사용하고, 그 뒤에는 해당 벡터에 push합니다.

use std::collections::HashMap;

fn main() {
    let mut groups: HashMap<bool, Vec<i32>> = HashMap::new();
    for n in [1, 2, 3, 4] {
        groups.entry(n % 2 == 0).or_default().push(n);
    }
    println!("evens: {:?}", groups[&true]);
}

get + insert를 사용하지 않는 이유

get을 호출한 다음 별도로 insert를 호출하면 키를 두 번 조회하게 되고 대여 검사기와 충돌합니다.

entry API는 한 번만 조회하고 정확히 하나의 안전한 참조를 제공하므로 더 빠르고 깔끔합니다.

함께 사용하기

여기서는 개수 세기와 기본값을 함께 사용해 각 문자로 시작하는 서로 다른 단어가 몇 개인지 찾습니다.

한 줄로 집계하는 방식이 실제로 작동하는 모습을 확인해 보세요.

use std::collections::HashMap;

fn main() {
    let words = ["ant", "art", "bee"];
    let mut by_first: HashMap<char, i32> = HashMap::new();
    for w in words {
        *by_first.entry(w.chars().next().unwrap()).or_insert(0) += 1;
    }
    println!("a: {}", by_first[&'a']);
}

빠른 확인

문자마다 한 번만 조회하면서 chars의 개수를 세고 싶습니다.

복습

entry API를 사용하면 한 번의 조회로 삽입 또는 업데이트를 처리할 수 있습니다.

or_insert, or_insert_with, or_default, and_modify를 사용해 항목을 세고 키별 목록을 깔끔하게 만들었습니다.

자주 묻는 질문

“Entry API와 기본값” 강의는 무료인가요?

네 — “Entry API와 기본값” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

“Entry API와 기본값”에서 뭘 배우나요?

값을 편리하게 갱신해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“Entry API와 기본값” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. HashMap 만들기
  2. Entry API와 기본값
  3. HashSet 다루기
  4. 개수 세기와 그룹화
← Learn Rust Coding(으)로 돌아가기