java

Map 에 관하여

heejunp 2025. 2. 18. 22:08

Java에서 Map 인터페이스는 키-값(Key-Value) 쌍을 저장하는 자료구조입니다. Map키의 중복을 허용하지 않으며, ListSet과는 다르게 특정 키를 사용하여 값을 효율적으로 조회할 수 있도록 설계되었습니다.

Java에서 Map 인터페이스의 대표적인 구현체는 HashMap, LinkedHashMap, TreeMap, Hashtable 등이 있습니다. 이 글에서는 각 구현체의 특징과 성능을 비교하고 적절한 사용 사례를 살펴보겠습니다.


1. Map 인터페이스란?

Map 인터페이스는 java.util 패키지에 속하며, 다음과 같은 특징을 가집니다:

  • 키-값(Key-Value) 쌍 저장
  • 키의 중복을 허용하지 않음
  • 값은 중복 가능
  • 빠른 검색 및 삽입 제공 (O(1) 또는 O(log n))

Java의 Map 인터페이스를 구현한 클래스에는 다음과 같은 주요 구현체들이 있습니다:

  • HashMap
  • LinkedHashMap
  • TreeMap
  • Hashtable

2. 주요 Map 구현체 비교

2.1 HashMap

HashMap해시 테이블(Hash Table) 기반Map 구현체로, 가장 널리 사용됩니다.

특징:

  • 순서를 보장하지 않음
  • 검색 및 삽입 속도가 빠름 (O(1))
  • null 키와 null 값 허용
  • Thread-safe 하지 않음

사용 예제:

import java.util.*;
public class HashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 10);
        map.put("Banana", 20);
        map.put("Cherry", 30);
        System.out.println(map); // 출력 예: {Banana=20, Apple=10, Cherry=30} (순서는 랜덤)
    }
}

사용 사례:

  • 빠른 검색과 삽입이 필요한 경우
  • 순서 유지가 필요 없는 경우

2.2 LinkedHashMap

LinkedHashMapHashMap의 특징을 유지하면서 키의 삽입 순서를 보장하는 Map 구현체입니다.

특징:

  • 요소의 삽입 순서 유지
  • 검색 및 삽입 속도 (O(1))
  • null 키와 null 값 허용
  • 메모리 사용량이 HashMap보다 큼 (이중 연결 리스트 사용)

사용 예제:

import java.util.*;
public class LinkedHashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();
        map.put("Dog", 100);
        map.put("Cat", 200);
        map.put("Horse", 300);
        System.out.println(map); // 출력: {Dog=100, Cat=200, Horse=300} (삽입 순서 유지)
    }
}

사용 사례:

  • 삽입 순서를 유지하면서도 빠른 검색과 삽입이 필요한 경우
  • 최근 사용한 데이터를 유지하는 캐시(Cache) 구현 시 사용

 

2.3 TreeMap

TreeMap이진 검색 트리(Red-Black Tree) 기반Map 구현체로, 키를 자동 정렬된 상태로 저장합니다.

특징:

  • 자동 정렬 유지 (오름차순, Comparator 사용 시 커스텀 정렬 가능)
  • 검색 성능 우수 (O(log n))
  • null 키 허용 불가 (값은 null 허용)
  • 메모리 사용량이 HashMap보다 큼

사용 예제:

import java.util.*;
public class TreeMapExample {
    public static void main(String[] args) {
        Map<Integer, String> map = new TreeMap<>();
        map.put(30, "Thirty");
        map.put(10, "Ten");
        map.put(20, "Twenty");
        System.out.println(map); // 출력: {10=Ten, 20=Twenty, 30=Thirty} (오름차순 정렬 유지)
    }
}

사용 사례:

  • 자동 정렬이 필요한 경우
  • 범위 검색(첫 번째, 마지막 키 찾기)이 필요한 경우

2.4 Hashtable

Hashtable해시 테이블 기반의 Map 구현체이며, HashMap과 유사하지만 동기화(Synchronized)가 적용되어 있습니다.

특징:

  • Thread-safe (멀티스레드 환경에서 사용 가능)
  • 순서를 보장하지 않음
  • null 키와 null 값 허용하지 않음
  • 성능이 HashMap보다 떨어짐 (동기화 오버헤드 존재)

사용 예제:

import java.util.*;
public class HashtableExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new Hashtable<>();
        map.put("Red", 500);
        map.put("Blue", 600);
        map.put("Green", 700);
        System.out.println(map); // 출력 예: {Green=700, Red=500, Blue=600} (순서는 랜덤)
    }
}

사용 사례:

  • 멀티스레드 환경에서 동기화된 Map이 필요한 경우
  • HashMap을 사용할 수 없는 동기화가 필수적인 환경

3. 마무리

  • HashMap: 빠른 검색과 삽입이 필요하고, 순서가 중요하지 않은 경우
  • LinkedHashMap: 삽입 순서를 유지하면서 빠른 검색이 필요한 경우
  • TreeMap: 자동 정렬이 필요하거나 범위 검색이 중요한 경우
  • Hashtable: 동기화가 필요한 멀티스레드 환경에서 사용