값에 접근하기
Coddy Rust 여정의 Logic & Flow 섹션에 포함된 레슨 — 66개 중 30번째.
해시 맵에 데이터를 저장한 후에는, 이를 검색할 방법이 필요합니다. .get() 메서드를 사용하면 키를 사용하여 값을 찾을 수 있습니다:
let value = my_map.get("some_key");하지만 이해해야 할 중요한 세부 사항이 있습니다: .get()은 값을 직접 반환하지 않습니다. 대신, Option 타입을 반환합니다. 이는 "무언가" 또는 "아무것도 없음"을 나타내는 Rust의 내장 타입입니다. 이는 찾고 있는 키가 해시 맵에 존재하지 않을 수도 있기 때문입니다.
키가 존재할 때, .get()은 Some(&value)를 반환합니다. & 기호에 주목하세요. 이는 값 자체가 아니라 값에 대한 참조를 얻는다는 것을 의미합니다. 키가 존재하지 않을 때는 None을 반환합니다:
match capitals.get("France") {
Some(capital) => println!("The capital is {}", capital),
None => println!("Country not found"),
}match 암(arm)이 명시적인 & 없이 Some(capital)을 사용하는 것을 눈치채셨을 것입니다. 이는 Rust가 이 컨텍스트에서 참조를 자동으로 처리하기 때문입니다. capital은 여전히 값에 대한 참조를 보유하지만, 패턴에 &를 명시적으로 작성할 필요는 없습니다. 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
직접 해보기
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을 생성하고, 국가와 수도를 삽입한 다음, 국가를 조회하세요
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.