Map은 키와 값을 짝지어 저장하는 자료 구조예요. 다른 프로그래밍 언어의 딕셔너리와 비슷해요. Map 인터페이스는 맵에서 할 수 있는 연산을 정의해요.
Java에는 여러 가지 Map 구현이 있어요. HashMap이 흔히 쓰이는 구현이에요.
// Make an instance
Map<String, Integer> fruitPrices = new HashMap<>();
put으로 맵에 항목을 추가해요.
fruitPrices.put("apple", 100);
fruitPrices.put("pear", 80);
// => { "apple" => 100, "pear" => 80 }
각 키에는 값 하나만 연결할 수 있어요.
같은 키로 put을 호출하면 그 키의 값이 바뀌어요.
fruitPrices.put("pear", 40);
// => { "apple" => 100, "pear" => 40 }
get으로 키의 값을 가져와요.
fruitPrices.get("apple"); // => 100
containsKey로 맵에 특정 키가 있는지 확인해요.
fruitPrices.containsKey("apple"); // => true
fruitPrices.containsKey("orange"); // => false
remove로 항목을 제거해요.
fruitPrices.put("plum", 90); // Add plum to map
fruitPrices.remove("plum"); // Removes plum from map
size 메서드는 항목의 개수를 반환해요.
fruitPrices.size(); // Returns 2
keySet이나 values 메서드를 사용하면 Map의 키는 Set으로, 값은 Collection으로 각각 가져올 수 있어요.
fruitPrices.keySet(); // Returns "apple" and "pear" in a set
fruitPrices.values(); // Returns 100 and 80, in a Collection
이 연습 문제에서는 Map을 사용해 국제 전화 코드 딕셔너리를 관리하는 코드를 작성해요.
이 딕셔너리에서는 국제 전화 코드(Integer인 맵의 키)로 국가 이름(String인 맵의 값)을 조회할 수 있어요.
매개변수를 받지 않고, 딕셔너리에 현재 들어 있는 전화 코드와 국가를 담은 맵을 반환하는 getCodes 메서드를 구현해요.
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.getCodes();
// => empty map
딕셔너리를 채워야 해요.
전화 코드와 그에 해당하는 국가를 받아 전화 코드와 국가를 추가하는 setDialingCode 메서드를 구현해요.
전화 코드가 이미 맵에 있으면, 주어진 코드와 국가로 맵을 업데이트해요.
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.setDialingCode(679, "Unknown");
// => { 679 => "Unknown" }
dialingCodes.setDialingCode(679, "Fiji");
// => { 679 => "Fiji" }
전화 코드를 받아 그 전화 코드에 해당하는 국가 이름을 반환하는 getCountry 메서드를 구현해요.
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.setDialingCode(55, "Brazil");
dialingCodes.getCountry(55);
// => "Brazil"
전화 코드를 추가할 때는 코드나 국가가 두 번 추가되지 않도록 주의해야 해요.
이런 상황이 생기면 첫 번째 항목이 올바른 항목이라고 가정할 수 있어요.
주어진 전화 코드와 국가에 대한 항목을 추가하는 addNewDialingCode 메서드를 구현해요.
하지만 setDialingCode와 달리, 전화 코드나 국가가 이미 맵에 있으면 아무것도 하지 않아요.
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.addNewDialingCode(32, "Belgium");
dialingCodes.addNewDialingCode(379, "Vatican City");
// => { 32 => "Belgium", 379 => "Vatican City" }
dialingCodes.addNewDialingCode(32, "Other");
dialingCodes.addNewDialingCode(39, "Vatican City");
// => { 32 => "Belgium", 379 => "Vatican City" }
드물지만 실수는 생길 수 있어요.
실수를 바로잡으려면 그 국가가 현재 어떤 전화 코드에 매핑되어 있는지 알아야 해요.
어떤 전화 코드를 고쳐야 하는지 찾기 위해, 국가를 받아 그 국가의 전화 코드를 반환하는 findDialingCode 메서드를 구현해요.
국가가 맵에 없으면 null을 반환해요.
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.addDialingCode(44, "UK");
dialingCodes.findDialingCode("UK");
// => 44
dialingCodes.findDialingCode("Unlisted");
// => null
이제 어떤 전화 코드를 고쳐야 하는지 알았으니, 코드를 업데이트해요.
국가의 새 전화 코드와 국가 이름을 받아 그에 맞게 업데이트하는 updateCountryDialingCode 메서드를 구현해요.
국가가 맵에 없으면 아무것도 하지 않아요 (이 메서드는 실수를 바로잡는 데만 도움을 주기 위한 것이기 때문이에요).
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.addDialingCode(88, "Japan");
// => { 88 => "Japan" }
dialingCodes.updateCountryDialingCode(81, "Japan");
// => { 81 => "Japan" }
dialingCodes.updateCountryDialingCode(32, "Mars");
// => { 81 => "Japan"}
Exercism에 가입하고 Java 트랙을 개념 26개연습 문제 158개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.