HashMap은 Rust에서 제공하는 기본적인 키-값 쌍 데이터 구조입니다. 다른 언어의 dictionary나 map과 비슷한 역할을 하며, 각 키는 고유하고 특정 값에 연결됩니다. Rust의 HashMap은 표준 라이브러리의 std::collections 모듈에 포함되어 있으며, 사용하기 위해서는 use std::collections::HashMap;을 통해 가져와야 합니다.
아래에서 HashMap의 기본적인 사용법과 주요 기능을 예시와 예제를 통해 설명하겠습니다.
HashMap에 대한 기본적인 개념이 필요하다면 [Rust] HashMap 기본 개념 설명를 참고해주세요.
1. HashMap 생성 및 기본 사용법
use std::collections::HashMap;
fn main() {
// 빈 HashMap 생성
let mut scores = HashMap::new();
// 키-값 쌍 추가
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
// 키를 사용하여 값을 가져오기
let team_name = String::from("Blue");
match scores.get(&team_name) {
Some(&score) => println!("Score for {}: {}", team_name, score),
None => println!("Team not found"),
}
// 전체 HashMap 출력
println!("{:?}", scores);
}
- HashMap::new()를 사용하여 빈 해시맵을 생성합니다.
- insert 메서드를 통해 키와 값을 추가합니다. 이때 키는 String 타입이고, 값은 i32 타입입니다.
- get 메서드를 통해 특정 키에 대한 값을 조회할 수 있습니다. 이 메서드는 Option 타입을 반환하므로, 값이 존재하는지 확인하고 접근하려면 match 또는 if let을 사용해야 합니다.
- 마지막으로, 전체 HashMap을 출력할 때는 {:?}를 사용하여 Debug 형식으로 출력할 수 있습니다.
2. 반복문을 사용한 HashMap 순회
HashMap은 반복문을 사용하여 순회할 수 있습니다. 이를 통해 모든 키-값 쌍에 접근할 수 있습니다.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
scores.insert(String::from("Red"), 30);
// HashMap을 순회하며 각 키-값 쌍을 출력
for (key, value) in &scores {
println!("Team: {}, Score: {}", key, value);
}
}
- for (key, value) in &scores를 사용하여 HashMap의 모든 키-값 쌍을 순회합니다.
- &scores를 사용하여 불변 참조를 가져오므로, 반복문 내에서 값을 변경할 수는 없지만 읽을 수는 있습니다.
3. 기존 값 업데이트
HashMap에서 기존 값을 업데이트하려면 키를 사용하여 새로운 값을 덮어씌울 수 있습니다. 예를 들어, 특정 팀의 점수를 업데이트하는 예제입니다:
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
// 키가 존재하는 경우, 새로운 값으로 덮어쓰기
scores.insert(String::from("Blue"), 25);
println!("{:?}", scores); // {"Blue": 25, "Yellow": 50}
}
- 동일한 키("Blue")에 대해 insert를 호출하면 기존 값이 새로운 값으로 업데이트됩니다.
- 이 예제에서는 "Blue" 팀의 점수가 10에서 25로 변경됩니다.
4. 값이 없을 때만 삽입하기 (entry 메서드)
entry 메서드를 사용하면 키가 존재하지 않을 때만 값을 삽입하거나, 키가 존재할 때 값을 수정하는 로직을 간편하게 구현할 수 있습니다.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
// "Yellow" 키가 없을 경우만 삽입
scores.entry(String::from("Yellow")).or_insert(50);
// "Blue" 키가 이미 존재하므로, 기존 값을 반환하고 삽입하지 않음
scores.entry(String::from("Blue")).or_insert(30);
println!("{:?}", scores); // {"Blue": 10, "Yellow": 50}
}
- entry 메서드는 Entry 타입을 반환하며, or_insert를 사용하면 키가 존재하지 않을 때만 값을 삽입합니다.
- "Yellow"는 해시맵에 없으므로 50이 삽입되지만, "Blue"는 이미 존재하므로 값이 변경되지 않습니다.
5. 값에 접근하여 계산 후 업데이트하기
키가 존재할 경우 값을 변경할 때, 현재 값을 참조하여 업데이트할 수도 있습니다.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
// 키가 존재하면, 해당 값을 가져와서 더한 후 업데이트
let blue_score = scores.entry(String::from("Blue")).or_insert(0);
*blue_score += 15;
println!("{:?}", scores); // {"Blue": 25, "Yellow": 50}
}
- or_insert 메서드는 키가 존재하지 않을 때 기본 값을 삽입하고 그 값을 반환합니다.
- blue_score += 15에서 를 사용하여 참조된 값을 직접 수정합니다. 이 방식으로 값을 가져와 수정할 수 있습니다.
6. HashMap에서 키-값 쌍 삭제하기
특정 키-값 쌍을 삭제할 때는 remove 메서드를 사용할 수 있습니다.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
// 특정 키 삭제
scores.remove("Blue");
println!("{:?}", scores); // {"Yellow": 50}
}
- "Blue" 키에 해당하는 항목이 삭제됩니다.
- 존재하지 않는 키를 삭제하려고 해도 에러가 발생하지 않습니다.
HashMap은 Rust에서 강력한 키-값 저장소를 제공합니다. 주요 기능은 다음과 같습니다:
- 생성: HashMap::new()를 사용하여 빈 해시맵 생성.
- 삽입 및 수정: insert 및 entry 메서드를 사용하여 값을 삽입하거나 조건부로 수정.
- 값 조회: get 메서드로 값 조회.
- 삭제: remove 메서드로 항목 삭제.
- 반복: for 루프를 사용하여 해시맵 순회.