Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

프로그래밍 공부

[자바] #13. 컬렉션 프레임워크 - 4. Map 본문

자바

[자바] #13. 컬렉션 프레임워크 - 4. Map

하 냥 2025. 2. 16. 07:39

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()));
    }
}