Java에서 데이터를 key-value 형태로 저장할 때 많이 사용하는 자료구조가 바로 Map입니다. 그중에서도 HashMap, TreeMap, LinkedHashMap은 가장 흔히 쓰이는 Map의 구현체들인데, 이들의 차이점과 사용 예시를 알아 보겠습니다.
HashMap: 빠르고 유연한 비동기 Map
기본 개념과 내부 구조
HashMap은 해시 테이블 구조를 사용하여 데이터를 저장합니다. key의 해시 값을 이용해 버킷(bucket)을 찾아 저장하고, 필요 시 연결 리스트나 트리 구조를 통해 데이터를 빠르게 조회할 수 있도록 합니다.
- Java 8 이후에는 해시 충돌을 최소화하기 위해, 해시 버킷이 일정 크기 이상이 되면 연결 리스트 대신 트리로 변환하여 조회 속도를 높입니다.
특징과 성능
- 동기화(Synchronization): 동기화를 지원하지 않아 멀티 쓰레드 환경에서는 안전하지 않습니다.
- 성능: 단일 쓰레드 환경에서 매우 빠르게 동작하며, 기본 Map 구현체로 사용하기 좋습니다.
- Null 허용: null 키와 null 값을 허용합니다.
예시
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 1);
hashMap.put("banana", 2);
System.out.println("HashMap: " + hashMap.get("apple"));
활용 상황
HashMap은 비동기 처리가 필요 없고, 빠른 데이터 저장과 조회가 필요할 때 적합합니다. 예를 들어, 캐시 데이터를 미리 로드하고 읽기 전용으로 사용할 경우에 적합합니다.
TreeMap: 순서가 중요한 경우 사용
기본 개념과 내부 구조
TreeMap은 레드-블랙 트리를 기반으로 데이터를 저장하며, 자동으로 정렬하여 key 순서대로 데이터를 유지합니다. 기본적으로 오름차순으로 정렬되지만, 사용자 지정 Comparator를 이용해 정렬 방식을 바꿀 수 있습니다.
특징과 성능
- 정렬: 삽입 시 자동으로 정렬되므로 정렬된 데이터를 유지해야 할 때 유용합니다.
- 성능: 검색, 삽입, 삭제가 O(log n)의 시간 복잡도를 가집니다.
- Null 허용: null 키는 허용하지 않지만 null 값은 허용합니다.
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("apple", 1);
treeMap.put("banana", 2);
System.out.println("TreeMap: " + treeMap.get("apple"));
활용 상황
데이터를 정렬된 상태로 유지해야 하는 경우에 TreeMap이 유용합니다. 예를 들어, 사전식으로 정렬된 데이터를 기반으로 검색을 해야 할 때 적합합니다.
LinkedHashMap: 순서가 필요한 경우 활용
기본 개념과 내부 구조
LinkedHashMap은 HashMap의 특성을 유지하면서도 데이터가 추가된 순서 또는 접근된 순서를 기준으로 순서를 유지하는 것이 특징입니다.
특징과 성능
- 순서 유지: 데이터 삽입 순서 또는 최근 접근 순서를 유지할 수 있습니다.
- 성능: HashMap과 유사한 성능을 가지며, 순서 유지가 필요한 경우 선택합니다.
- Null 허용: null 키와 null 값을 허용합니다.
예시
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("apple", 1);
linkedHashMap.put("banana", 2);
System.out.println("LinkedHashMap: " + linkedHashMap.get("apple"));
활용 상황
데이터가 삽입된 순서나 접근 순서를 유지해야 할 때 적합합니다. 예를 들어, 캐시 데이터에 대해 LRU(Least Recently Used) 방식으로 삭제가 필요할 때 LinkedHashMap을 사용할 수 있습니다.
HashMap, TreeMap, LinkedHashMap 차이점 정리
특징HashMapTreeMapLinkedHashMap
동기화 | 지원하지 않음 | 지원하지 않음 | 지원하지 않음 |
정렬 방식 | 없음 | 키의 정렬 순서 유지 | 삽입 순서 또는 접근 순서 유지 |
성능 | 가장 빠름 | 검색/삽입/삭제 O(log n) | HashMap과 유사 |
Null 허용 여부 | null 키와 값 허용 | null 키 허용 안됨 | null 키와 값 허용 |
사용 예시 | 비동기 처리 필요 없을 때 | 정렬된 데이터 유지 필요 시 | 순서가 중요한 경우 |
정리
Map 컬렉션을 선택할 때는 데이터를 저장하는 방식이나 동기화 여부, 데이터 접근 패턴 등을 잘 고려해야 합니다. HashMap은 기본적으로 빠른 데이터 처리를, TreeMap은 정렬된 데이터를, LinkedHashMap은 순서가 중요한 데이터를 처리하는 데 적합합니다.
'JAVA' 카테고리의 다른 글
[Java] Reflection를 활용한 런타임 동적 프로그래밍 (1) | 2024.11.15 |
---|---|
자바의 HashMap vs ConcurrentHashMap: 차이점과 활용법 (1) | 2024.11.03 |
Java record: 불변 객체의 간결한 정의와 활용 (0) | 2024.10.23 |