개발은 재밌어야 한다
article thumbnail

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은 순서가 중요한 데이터를 처리하는 데 적합합니다.

profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!