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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- HashMap 만들기
- Entry API와 기본값
- HashSet 다루기
- 개수 세기와 그룹화