
코틀린에서 mutableMapOf()를 사용하면 내부적으로 LinkedHashMap이 생성됩니다.
처음에는 mutableMapOf()를 단순히 사용했지만, 왜 기본 구현체가 LinkedHashMap일까? 라는 의문이 들었습니다.
이 글에서는 그 이유를 고민해보고, HashMap, LinkedHashMap, TreeMap의 차이를 비교한 내용을 정리해보겠습니다.
1. mutableMapOf()는 LinkedHashMap을 사용한다
우선, mutableMapOf()가 내부적으로 어떤 자료구조를 사용하는지 확인해보겠습니다.

즉, 코틀린의 mutableMapOf()는 기본적으로 LinkedHashMap을 사용한다는 것을 확인할 수 있었습니다.
그렇다면 왜 LinkedHashMap을 기본으로 사용할까?
2. LinkedHashMap이 기본 구현체인 이유
1) 입력된 순서를 유지할 수 있다
- HashMap은 키를 저장할 때 순서를 보장하지 않음.
- 하지만 LinkedHashMap은 데이터가 추가된 순서를 유지하며, 이후 조회할 때도 입력된 순서대로 반환됨.
fun main() {
val hashMap = hashMapOf(3 to "C", 1 to "A", 2 to "B")
val linkedHashMap = linkedMapOf(3 to "C", 1 to "A", 2 to "B")
println("HashMap: ${hashMap.keys}") // 순서 보장 X
println("LinkedHashMap: ${linkedHashMap.keys}") // 입력 순서 유지
}
출력 결과 예시:
HashMap: [2, 3, 1] // 순서 랜덤
LinkedHashMap: [3, 1, 2] // 입력 순서 유지
즉, mutableMapOf()를 사용하면 데이터를 저장한 순서대로 가져올 수 있다는 장점이 있습니다.
2) HashMap과 동일한 빠른 조회 속도를 제공한다
- LinkedHashMap은 내부적으로 해시 테이블(Hash Table)과 이중 연결 리스트(Double Linked List)를 사용함.
- 해시 테이블을 사용하기 때문에 키 기반 조회 속도는 O(1)로 매우 빠름.
즉, LinkedHashMap은 HashMap의 속도를 유지하면서도 순서까지 보장하는 장점이 있습니다.
3) 직관적인 동작과 예측 가능한 순서 유지
- HashMap은 내부적으로 랜덤한 순서로 데이터를 저장하기 때문에, 같은 데이터를 넣더라도 출력 순서가 달라질 수 있음.
- LinkedHashMap은 입력된 순서를 유지하기 때문에 일관된 결과를 보장하여 디버깅이나 데이터 관리가 쉬움.
즉, mutableMapOf()가 LinkedHashMap을 기본 구현체로 사용하는 이유는 코틀린이 가독성과 일관성을 중요하게 생각하기 때문이라고 볼 수 있습니다.
3. HashMap, LinkedHashMap, TreeMap 비교
자료구조 | 조회 속도 | 입력 순서 유지 | 정렬 기능 |
HashMap | O(1) | ❌ (순서 보장 X) | ❌ |
LinkedHashMap | O(1) | ✅ (입력 순서 유지) | ❌ |
TreeMap | O(log N) | ✅ (정렬 순서 유지) | ✅ |
HashMap vs. LinkedHashMap 차이
- HashMap은 입력 순서를 보장하지 않음, 키의 해시값에 따라 저장 위치가 결정됨.
- LinkedHashMap은 입력 순서를 유지하며, 해시 테이블과 이중 연결 리스트를 함께 사용함.
- TreeMap은 키 값을 기준으로 자동 정렬하지만 속도가 O(log N)으로 상대적으로 느림.
즉, LinkedHashMap은 HashMap과 같은 빠른 속도를 유지하면서도, 입력된 순서를 보장하는 장점이 있음.
4. LinkedHashMap의 동작 방식
LinkedHashMap은 HashMap의 기능을 유지하면서도 입력된 순서를 기억하는 자료구조입니다.
내부 동작
- 해시 테이블(Hash Table) → 키를 해시 함수로 변환하여 빠르게 조회 (O(1))
- 이중 연결 리스트(Double Linked List) → 노드를 연결하여 입력된 순서 유지
즉, LinkedHashMap은 HashMap처럼 빠른 조회가 가능하면서도, 추가적인 연결 리스트를 사용하여 순서를 기억하는 기능이 추가된 구조입니다.
5. mutableMapOf()를 사용할 때 주의할 점
1) 대량의 데이터를 저장할 경우 메모리 사용량 증가
- LinkedHashMap은 HashMap보다 메모리를 더 많이 사용함.
- 이유는 이중 연결 리스트를 유지해야 하기 때문.
2) 정렬이 필요한 경우 TreeMap 사용 고려
- LinkedHashMap은 입력 순서를 유지하지만, 정렬 기능은 지원하지 않음.
- 정렬된 데이터를 원한다면 TreeMap을 사용하는 것이 더 적절함.
6. 결론
- mutableMapOf()는 기본적으로 LinkedHashMap을 사용하여 입력된 순서를 유지하면서도 빠른 조회 속도(O(1))를 제공.
- HashMap은 순서를 보장하지 않지만, LinkedHashMap은 입력된 순서를 유지하면서도 HashMap과 같은 성능을 제공.
- 만약 정렬된 데이터가 필요하다면 TreeMap을 사용하는 것이 더 적합함.
즉, 코틀린에서 mutableMapOf()가 LinkedHashMap을 기본으로 사용하는 이유는 "빠른 조회 속도를 유지하면서도 입력된 순서를 보장하기 위해서" 라고 정리할 수 있습니다.
'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] mutableMapOf vs hashMapOf 차이점 및 성능 비교 (0) | 2025.02.06 |
---|---|
[Android/Kotlin] fold 사용법과 예제 (0) | 2025.02.05 |
[Android/Kotlin] 코틀린 컬렉션 함수: any와 all (0) | 2025.01.21 |
[Android/Kotlin] removeAt: 요소 제거와 반환 동작 이해 (1) | 2025.01.17 |
[Android/Kotlin] sortWith vs sortedWith: 차이와 사용법 (0) | 2025.01.02 |