본문 바로가기
Language/Java

[JAVA] LinkedHashMap의 특징과 활용 : 순서가 보장되는 Map의 마법

by Papa Martino V 2026. 1. 19.
728x90

LinkedHashMap
LinkedHashMap

자바 개발을 하다 보면 데이터를 Key-Value 쌍으로 관리해야 할 때 가장 먼저 떠올리는 것이 HashMap입니다. 하지만 HashMap은 치명적인 단점이 하나 있습니다. 바로 데이터의 삽입 순서를 유지하지 않는다는 점입니다. 로그 데이터를 순차적으로 기록하거나, 캐시(Cache) 시스템을 구현할 때 순서 정보의 부재는 큰 제약이 됩니다. 이러한 문제를 우아하게 해결해주는 것이 바로 LinkedHashMap입니다. 오늘 이 글에서는 단순한 API 사용법을 넘어, LinkedHashMap의 내부 구조와 동작 원리, 그리고 실무에서 바로 적용 가능한 최적화 팁까지 전문적인 식견으로 깊이 있게 다뤄보겠습니다.

1. LinkedHashMap이란 무엇인가?

LinkedHashMapHashMap을 상속받으면서도, 내부에 이중 연결 리스트(Doubly Linked List)를 유지하여 요소들의 순서를 추적하는 자료구조입니다. HashMap의 빠른 검색 성능(O(1))을 유지하면서도, 데이터가 들어온 순서 혹은 최근에 접근한 순서를 기억할 수 있다는 점이 핵심입니다.

2. LinkedHashMap의 3가지 핵심 특징

① 순서의 보장 (Order Preservation)

기본적으로 LinkedHashMap은 데이터가 삽입된 순서(Insertion-order)를 유지합니다. 이는 데이터를 순회(Iteration)할 때 입력된 순서 그대로 결과가 나옴을 보장하며, 사용자 UI 리스트나 설정 정보를 관리할 때 매우 유용합니다.

② 접근 순서 모드 (Access-order Mode)

LinkedHashMap의 독특한 기능 중 하나는 생성자 설정을 통해 '최근에 접근한 순서'로 데이터를 정렬할 수 있다는 점입니다. get()이나 put()을 호출할 때 해당 요소가 리스트의 맨 뒤로 이동하게 되며, 이를 활용하면 LRU(Least Recently Used) 캐시를 손쉽게 구현할 수 있습니다.

③ HashMap 대비 오버헤드

모든 노드가 연결 리스트로 연결되어 있기 때문에 HashMap보다는 약간 더 많은 메모리를 사용하며, 삽입/삭제 시 연결 리스트를 업데이트하는 추가 연산이 필요합니다. 하지만 순회가 잦은 경우, 버킷의 전체 크기가 아닌 실제 저장된 요소의 개수만큼만 순회하므로 때때로 HashMap보다 성능이 우수할 수 있습니다.

3. HashMap vs LinkedHashMap vs TreeMap 비교

상황에 맞는 최적의 Map을 선택하기 위해 세 가지 주요 Map 구현체를 비교해 보았습니다.

특징 HashMap LinkedHashMap TreeMap
순서 보장 보장하지 않음 삽입 또는 접근 순서 Key의 자연 순서/Comparator
정렬 기준 해시(Hash) 연결 리스트(Link) 이진 트리(Tree)
시간 복잡도 O(1) O(1) O(log n)
Null 허용 Key/Value 모두 허용 Key/Value 모두 허용 Value만 허용 (Key 불가)
주요 용도 일반적인 빠른 검색 캐시, 순서 기반 처리 범위 검색, 정렬된 상태 유지

4. 실무 활용 팁: LRU 캐시 구현하기

LinkedHashMapremoveEldestEntry() 메서드를 오버라이딩하면 일정 크기를 넘었을 때 가장 오래된 데이터를 자동으로 삭제하는 캐시 알고리즘을 단 몇 줄로 구현할 수 있습니다.


LinkedHashMap<Integer, String> cache = new LinkedHashMap<>(16, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest) {
        return size() > 100; // 최대 크기가 100을 넘으면 가장 오래된 데이터 삭제
    }
};

5. 결론: 언제 사용해야 할까?

검색 속도가 중요하면서도 데이터의 흐름(순서)이 유의미한 비즈니스 로직을 설계할 때 LinkedHashMap은 최상의 선택지입니다. 특히 데이터의 입력 순서가 출력 결과에 반영되어야 하는 API 응답 객체 구성이나, 한정된 자원 내에서 효율적인 메모리 관리가 필요한 캐시 시스템에서 그 진가를 발휘합니다.


※ 출처 및 참고 자료

  • Oracle Java Documentation: Class LinkedHashMap
  • Effective Java 3rd Edition (Joshua Bloch) - Item 10, 18 참조

 

728x90