프로그래밍 공부
[자바] #13. 컬렉션 프레임워크 - 4. Map 본문
Map<K, V>는 키(Key)와 값(Value) 쌍으로 데이터를 저장하는 자료구조다.
배열, List, Set처럼 단순히 값을 저장하는 것이 아니라 키를 통해 값을 효율적으로 검색할 수 있다.
📌 Map<K, V> 인터페이스란?
✔ Key는 중복 불가 (Set처럼 동작)
✔ Value는 중복 허용
✔ 빠른 검색 및 수정 가능 (O(1) ~ O(log N))
📌 Map<K, V>을 구현하는 주요 컬렉션 클래스들
| 클래스명 | 내부 구조 | 정렬 여부 | null 허용 여부 (Key / Value) |
주요 특징 |
| HashMap<K, V> | 해시 테이블 | ❌ 정렬 안 됨 | ✅ / ✅ | 가장 빠른 Map, 기본적으로 많이 사용됨 |
| LinkedHashMap<K, V> | 해시 테이블 + 이중 연결 리스트 |
✅ 삽입 순서 유지 | ✅ / ✅ | HashMap과 동일하지만 순서 유지 |
| TreeMap<K, V> | 레드-블랙 트리(BST) | ✅ Key 기준 정렬 | ❌ / ✅ | 정렬된 Map, Key를 기준으로 자동 정렬 |
| Hashtable<K, V> | 해시 테이블 | ❌ 정렬 안 됨 | ❌ / ❌ | HashMap과 유사하지만 동기화 지원 (스레드 안전) |
📌 HashMap<K, V> (가장 많이 사용됨)
HashMap<K, V>는 해시 테이블(Hash Table) 기반의 Map 구현체.
✔ Key를 해시 함수로 변환하여 빠르게 데이터 저장 및 검색 가능
✔ null 키와 null 값 허용
✔ 순서를 유지하지 않음
✔ 가장 빠른 성능 (O(1))
🔹 HashMap 예제
import java.util.Map;
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
// 요소 추가
map.put("Apple", 1000);
map.put("Banana", 1500);
map.put("Cherry", 2000);
map.put(null, 500); // ✅ Key에 null 허용
map.put("Orange", null); // ✅ Value에 null 허용
// Key를 이용한 Value 조회
System.out.println("Banana 가격: " + map.get("Banana"));
// 요소 출력
System.out.println(map); // {null=500, Apple=1000, Banana=1500, Cherry=2000, Orange=null}
}
}
출력 순서는 보장되지 않음! (HashMap은 순서 유지 X)
📌 TreeMap<K, V> (Key 기준 정렬)
✔ 레드-블랙 트리(Red-Black Tree = BST) 기반 → Key를 자동 정렬
✔ Key를 기준으로 오름차순 정렬(기본), Comparator를 사용하면 내림차순 정렬 가능
✔ Key에 null 허용 안 됨! (NullPointerException 발생)
🔹 TreeMap 예제
import java.util.Map;
import java.util.TreeMap;
public class TreeMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("Banana", 1500);
map.put("Cherry", 2000);
map.put("Apple", 1000);
System.out.println(map); // {Apple=1000, Banana=1500, Cherry=2000} (자동 정렬됨)
}
}
Key 기준으로 오름차순 정렬된다.
🔍 Map에서 요소 순회하는 방법
✅ 1) keySet()을 이용한 for-each 순회
for (String key : map.keySet()) {
System.out.println(key + " : " + map.get(key));
}
keySet()은 Key만 담고 있는 컬렉션 인스턴스를 생성하는 것이다!
Set<Integer> ks = map.keySet() 후 for(String key : ks) 이것과 같다.
✅ 2) 람다 표현식을 이용해 for-each 순회
map.forEach((key, value) -> System.out.println(key + " : " + value));
마지막으로, 위 TreeMap 예제에서 가격을 기준으로 내림차순으로 정보가 출력되도록 예제를 수정해보자.
Comparator<T> 인터페이스를 사용해서 TreeSet<E>의 정렬 기준을 변경했던 기억을 떠올려보자.
import java.util.Map;
import java.util.TreeMap;
import java.util.Iterator;
class ValueComparator implements Comparator<Integer> {
public int compare(Integer n1, Integer n2) {
return n2.intValue() - n1.intValue();
// intValue()는 "Integer 객체에서" int형 값을 뽑아내는 메소드
}
}
public class TreeMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>(new ValueComparator()); // 인자로 넘겨줌
map.put("Banana", 1500);
map.put("Cherry", 2000);
map.put("Apple", 1000);
// 반복자를 기반으로 전체 Value 출력
for(Iterator<Integer> itr = map.keySet().iterator(); itr.hasNext(); )
System.out.println(map.get(itr.next()));
}
}
'자바' 카테고리의 다른 글
| [자바] #15. 열거형, 가변 인자, 어노테이션 (0) | 2025.02.19 |
|---|---|
| [자바] #14. Collections 클래스 안의 여러 알고리즘 구현 메서드들 (0) | 2025.02.19 |
| [자바] #12. 컬렉션 프레임워크 - 3. Queue, Deque (0) | 2025.02.16 |
| [자바] #11. 컬렉션 프레임워크 - 2. Set (HashSet, TreeSet) (0) | 2025.02.16 |
| [자바] #10. 컬렉션 프레임워크 - 1. 컬렉션에 대한 전반적인 이해와 ArrayList에 대해 (0) | 2025.02.16 |