값에 접근하기
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 30번째.
해시 맵에 데이터를 저장하고 나면, 이를 검색할 방법이 필요합니다. .get() 메서드를 사용하면 키를 사용하여 값을 조회할 수 있습니다:
let value = my_map.get("some_key");하지만 이해해야 할 중요한 세부 사항이 있습니다: .get()은 값을 직접 반환하지 않습니다. 대신, 값이 존재함(Some) 또는 존재하지 않음(None)을 나타내는 Rust의 내장 타입인 Option 타입을 반환합니다. 이는 찾고 있는 키가 해시 맵에 존재하지 않을 수도 있기 때문입니다.
키가 존재할 때, .get()은 Some(&value)를 반환합니다. & 기호에 주목하세요. 이는 값에 대한 참조를 얻는다는 것을 의미합니다. 키가 존재하지 않으면 None을 반환합니다:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}Some(capital) 매치 암(match arm)에서, Rust는 자동으로 참조를 처리해 줍니다. 여기서 capital은 내부의 참조된 값에 바인딩되므로, 패턴에 &를 명시적으로 작성할 필요가 없습니다.
이 설계는 존재하지 않는 키에 접근하려고 할 때 프로그램이 충돌하는 것을 방지합니다. 오류를 발생시키는 대신, Rust는 값을 찾는 경우와 찾지 못하는 경우라는 두 가지 가능성을 모두 처리하도록 강제함으로써 코드를 더욱 견고하고 예측 가능하게 만듭니다.
챌린지
쉬움두 개의 입력을 받게 됩니다: 국가 이름과 수도 이름입니다. 국가 이름을 키(타입 String)로 하고 수도 이름을 값(타입 String)으로 저장하는 해시 맵을 생성하세요. 국가와 수도를 해시 맵에 삽입합니다. 그런 다음, 조회할 또 다른 국가 이름을 세 번째 입력으로 받습니다. .get() 메서드를 사용하여 이 국가의 수도를 검색하고, 국가가 맵에 존재하는 경우와 존재하지 않는 경우의 두 가지 상황을 모두 처리하세요.
참고: .get()은 Option을 반환합니다. 키가 존재하면 Some(&value)(값에 대한 참조)를, 존재하지 않으면 None을 반환합니다. match 문 내에서 Some(capital)이라고 작성하면 Rust가 자동으로 참조를 처리해 주므로, 출력문에서 capital을 직접 사용할 수 있습니다.
요구 사항:
std::collections에서HashMap을 임포트하세요.HashMap<String, String>타입의 가변(mutable) 해시 맵을 생성하세요.- 첫 번째 입력을 국가 이름으로 읽어옵니다.
- 두 번째 입력을 수도 이름으로 읽어옵니다.
- 국가와 수도를 해시 맵에 삽입하세요.
- 세 번째 입력을 조회할 국가 이름으로 읽어옵니다.
.get()을 사용하여 조회할 국가의 수도를 검색하세요.match를 사용하여.get()이 반환한Option을 처리하세요.- 국가를 찾은 경우, 다음을 출력합니다:
The capital of [country] is [capital] - 국가를 찾지 못한 경우, 다음을 출력합니다:
[country] not found in the map
입력:
- 첫 번째 줄: 삽입할 국가 이름 (예:
France) - 두 번째 줄: 수도 이름 (예:
Paris) - 세 번째 줄: 조회할 국가 이름 (예:
France또는Germany)
출력:
- 조회할 국가가 존재하는 경우:
The capital of [country] is [capital] - 조회할 국가가 존재하지 않는 경우:
[country] not found in the map
치트 시트
.get() 메서드는 키를 사용하여 해시 맵에서 값을 가져옵니다:
let value = my_map.get("some_key");.get() 메서드는 키가 해시 맵에 존재하지 않을 수도 있기 때문에 Option 타입을 반환합니다:
- 키가 존재할 때:
Some(&value)를 반환합니다 (값에 대한 참조) - 키가 존재하지 않을 때:
None을 반환합니다
두 가지 경우를 모두 처리하려면 match를 사용하세요:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}이러한 설계는 두 가지 가능성을 모두 처리하도록 강제함으로써 존재하지 않는 키에 접근할 때 발생하는 충돌을 방지합니다.
직접 해보기
use std::collections::HashMap;
use std::io;
fn main() {
// 삽입할 국가 이름을 읽어옵니다
let mut country = String::new();
io::stdin().read_line(&mut country).expect("Failed to read line");
let country = country.trim().to_string();
// 수도 이름을 읽어옵니다
let mut capital = String::new();
io::stdin().read_line(&mut capital).expect("Failed to read line");
let capital = capital.trim().to_string();
// 조회할 국가 이름을 읽어옵니다
let mut lookup_country = String::new();
io::stdin().read_line(&mut lookup_country).expect("Failed to read line");
let lookup_country = lookup_country.trim().to_string();
// TODO: 아래에 코드를 작성하세요
// HashMap을 생성하고, 국가와 수도를 삽입한 다음, 국가를 조회하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.