자바 - 맵 인터페이스
안녕하세요, 미래의 자바 개발자 여러분! 오늘 우리는 자바의 Collections 프레임워크中最も 다재다능하고 강력한 구성 요소 중 하나인 맵(Map) 인터페이스에 대해 배울 것입니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 이 여정을 안내해 드리게 되어 매우 기쁩니다. 그러니 여러분의 좋아하는 음료를 마시고 편안하게 자리를 잡아, 함께 이 모험을 시작해 보겠습니다!
맵(Map)이란?
거대한 도서관을 정리하고 싶을 때, 각 책을 찾기 위해 모든 책장을 검색할 필요가 없기를 바랄 것입니다. 이때 맵(Map)이 유용하게 쓰입니다. 맵은 프로그래밍 세계에서 마법의 도서관 사서처럼, 당신이 요청한 어떤 책이라도 즉시 찾아줄 수 있습니다.
자바에서 맵은 키-값 쌍을 저장하는 객체입니다. 각 키는 특정 값과 연결되어 있으며, 책 제목(키)이 도서관에서의 위치(값)와 연결되는 것과 같습니다.
맵(Map)의 주요 특성
- 각 키는 고유해야 합니다.
- 각 키는 최대 하나의 값과 매핑됩니다.
- 빠른 검색과 데이터检索에 완벽합니다.
맵(Map) 인터페이스 메서드
맵(Map) 인터페이스에서 가장 자주 사용되는 메서드 중 일부를 살펴보겠습니다:
메서드 | 설명 |
---|---|
put(K key, V value) |
맵에 키-값 쌍을 추가합니다 |
get(Object key) |
지정된 키와 연결된 값을 반환합니다 |
remove(Object key) |
지정된 키와 연결된 키-값 쌍을 제거합니다 |
clear() |
맵에서 모든 키-값 쌍을 제거합니다 |
size() |
맵에 있는 키-값 쌍의 수를 반환합니다 |
isEmpty() |
맵이 키-값 쌍을 포함하고 있지 않다면 true를 반환합니다 |
containsKey(Object key) |
맵에 지정된 키가 있으면 true를 반환합니다 |
containsValue(Object value) |
맵에 지정된 값이 있으면 true를 반환합니다 |
keySet() |
맵에 있는 모든 키의 Set을 반환합니다 |
values() |
맵에 있는 모든 값의 Collection을 반환합니다 |
entrySet() |
맵에 있는 모든 키-값 쌍의 Set을 반환합니다 |
맵(Map)을 구현한 클래스
자바는 맵(Map) 인터페이스를 구현하는 여러 클래스를 제공합니다. 가장 자주 사용되는 세 가지를 살펴보겠습니다:
1. HashMap
HashMap은 빠르게 책을 찾을 수 있는 속도가 빠른 사서지만, 책의 순서는 신경 쓰지 않습니다.
Map<String, Integer> ages = new HashMap<>();
ages.put("Alice", 25);
ages.put("Bob", 30);
ages.put("Charlie", 35);
System.out.println(ages.get("Bob")); // 출력: 30
이 예제에서는 사람들의 나이를 저장하기 위해 HashMap을 생성하고 있습니다. 키는 사람의 이름(String)이고, 값은 그들의 나이(Integer)입니다.
2. TreeMap
TreeMap은 모든 책을 제목의 알파벳 순서로 정렬하는 사서입니다.
Map<String, String> capitals = new TreeMap<>();
capitals.put("USA", "Washington D.C.");
capitals.put("France", "Paris");
capitals.put("Japan", "Tokyo");
for (String country : capitals.keySet()) {
System.out.println(country + ": " + capitals.get(country));
}
이 코드는 나라와 그 나라의 수도를 나라 이름의 알파벳 순서로 출력합니다:
France: Paris
Japan: Tokyo
USA: Washington D.C.
3. LinkedHashMap
LinkedHashMap은 책이 도서관에 추가된 순서를 기억하는 사서입니다.
Map<String, Double> prices = new LinkedHashMap<>();
prices.put("Apple", 0.99);
prices.put("Banana", 0.59);
prices.put("Cherry", 3.99);
for (Map.Entry<String, Double> entry : prices.entrySet()) {
System.out.println(entry.getKey() + ": $" + entry.getValue());
}
이 코드는 과일과 그 가격을 추가된 순서대로 출력합니다:
Apple: $0.99
Banana: $0.59
Cherry: $3.99
맵(Map)을 확장한 인터페이스
맵(Map) 인터페이스는 두 가지 주요 하위 인터페이스를 가지고 있습니다:
- SortedMap
- NavigableMap
이 인터페이스들은 정렬된 맵을 다루는 추가 기능을 제공합니다. TreeMap은 이 두 인터페이스를 모두 구현합니다.
맵(Map) 인터페이스의 예제
이제 몇 가지 실용적인 예제를 통해 이해를 더욱 solidify시키겠습니다:
예제 1: 학생 성적 추적 시스템
학생들의 성적을 추적하는 시스템을 구축하는 상상해 봅시다:
Map<String, Integer> studentGrades = new HashMap<>();
// 학생 성적 추가
studentGrades.put("Alice", 95);
studentGrades.put("Bob", 80);
studentGrades.put("Charlie", 85);
// 성적 업데이트
studentGrades.put("Bob", 82);
// 성적检索
System.out.println("Alice's grade: " + studentGrades.get("Alice"));
// 학생 존재 여부 확인
if (studentGrades.containsKey("David")) {
System.out.println("David's grade: " + studentGrades.get("David"));
} else {
System.out.println("David is not in the system.");
}
// 모든 학생 성적 출력
for (Map.Entry<String, Integer> entry : studentGrades.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
이 예제는 맵에 추가, 업데이트,检索 및 반복을 하는 방법을 보여줍니다.
예제 2: 단어 빈도수 계산기
문장에서 단어의 빈도수를 계산하는 프로그램을 만들어 보겠습니다:
String sentence = "the quick brown fox jumps over the lazy dog";
String[] words = sentence.split(" ");
Map<String, Integer> wordFrequency = new HashMap<>();
for (String word : words) {
if (wordFrequency.containsKey(word)) {
wordFrequency.put(word, wordFrequency.get(word) + 1);
} else {
wordFrequency.put(word, 1);
}
}
for (Map.Entry<String, Integer> entry : wordFrequency.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
이 프로그램은 문장을 단어로 나누고 각 단어가 나타나는 빈도수를 계산하여 맵에 저장합니다.
결론
축하합니다! 자바의 맵(Map) 인터페이스의 첫 걸음을 뗐습니다. 우리는 기본 개념을 배우고, 다양한 구현을 탐구하며, 몇 가지 실용적인 예제를 해결했습니다. 맵(Map)은 정보를 효율적으로 정리하고检索하는 데 도움이 되는 중요한 도구입니다.
자바의 여정을 계속하면서, 맵(Map)은 간단한 프로그램에서 복잡한 애플리케이션에 이르기까지 어디서나 자주 나타날 것입니다. 그들은 어떤 자바 개발자의 도구箱에서 빼놓을 수 없는 도구입니다.
계속 연습하고, 호기심을 가져라. 그러면 언제 그런가, 복잡한 문제를 해결하는 데 맵(Map)을 사용하여 쉽게 해결할 수 있을 것입니다. 행복하게 코딩하세요, 미래의 자바 마스터们!
Credits: Image by storyset