Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 JShell에서 HashMap, LinkedHashMap, TreeMap 구현하는 방법

JShellJava 9에서 새롭게 도입된 명령줄(command-line) 프롬프트 도구입니다. 흔히 REPL(Read-Eval-Print Loop) 도구라고도 불리며, 간단한 코드 문장을 입력하면 즉시 평가하고 실행한 뒤 그 결과를 바로 출력해 주는 기능을 제공합니다.

Map 인터페이스는 요소들을 키(key)/값(value) 쌍의 형태로 저장하는 컬렉션을 구현하기 위한 규약(계약)을 정의합니다. 이 Map 인터페이스를 구현하는 대표적인 Java 컬렉션 클래스로는 HashMap, LinkedHashMap, TreeMap이 있습니다. 각 클래스는 데이터를 저장하고 관리하는 방식에서 서로 다른 특징을 가지고 있으며, 아래 예제를 통해 JShell에서 어떻게 동작하는지 확인할 수 있습니다.

1. HashMap — 순서가 보장되지 않음

아래 코드 스니펫에서 볼 수 있듯이, HashMap에 저장된 요소들은 삽입 순서나 키의 정렬 순서 중 어느 것으로도 저장이 보장되지 않습니다. 내부적으로 해싱(hashing) 알고리즘에 따라 위치가 결정되기 때문입니다.

Snippet-1

jshell> HashMap<String, Integer> hashMap = new HashMap<>();
hashMap ==> {}

jshell> hashMap.put("Adithya", 101);
$2 ==> null

jshell> hashMap.put("Jai", 102);
$3 ==> null

jshell> hashMap.put("Chaitanya", 103);
$4 ==> null

jshell> hashMap.put("Ravi", 104);
$5 ==> null

jshell> hashMap
hashMap ==> {Chaitanya=103, Jai=102, Ravi=104, Adithya=101}

출력 결과를 보면 입력한 순서(Adithya → Jai → Chaitanya → Ravi)와 전혀 다른 순서로 요소들이 저장된 것을 확인할 수 있습니다.

2. LinkedHashMap — 삽입 순서 유지

반면 LinkedHashMap은 요소들이 삽입된 순서(insertion order) 그대로 저장됩니다. 내부적으로 연결 리스트(linked list)를 사용하여 입력 순서를 유지하기 때문에, 순서가 중요한 경우에 유용합니다.

Snippet-2

jshell> LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap ==> {}

jshell> linkedHashMap.put("Raja", 101);
$8 ==> null

jshell> linkedHashMap.put("Adithya", 102);
$9 ==> null

jshell> linkedHashMap.put("Surya", 103);
$10 ==> null

jshell> linkedHashMap.put("Vamsi", 104);
$11 ==> null

jshell> linkedHashMap
linkedHashMap ==> {Raja=101, Adithya=102, Surya=103, Vamsi=104}

출력 결과에서 입력한 순서(Raja → Adithya → Surya → Vamsi)가 그대로 유지되는 것을 확인할 수 있습니다.

3. TreeMap — 키의 자연 정렬 순서

TreeMap은 요소들을 키의 자연 정렬 순서(natural sorted order)에 따라 저장합니다. 내부적으로 레드-블랙 트리(Red-Black Tree) 구조를 사용하기 때문에 항상 키를 기준으로 오름차순 정렬된 상태를 유지합니다.

Snippet-3

jshell> TreeMap<String, Integer> treeMap = new TreeMap<>();
treeMap ==> {}

jshell> treeMap.put("Raj", 101);
$14 ==> null

jshell> treeMap.put("Pavan", 102);
$15 ==> null

jshell> treeMap.put("Arjun", 103);
$16 ==> null

jshell> treeMap.put("Manoj", 104);
$17 ==> null

jshell> treeMap
treeMap ==> {Arjun=103, Manoj=104, Pavan=102, Raj=101}

출력 결과를 보면 입력 순서와 무관하게 키가 알파벳 순(Arjun → Manoj → Pavan → Raj)으로 자동 정렬되어 저장된 것을 확인할 수 있습니다.

정리

세 클래스의 주요 차이점을 요약하면 다음과 같습니다.

  • HashMap: 순서 보장 없음, 일반적으로 가장 빠른 조회 성능
  • LinkedHashMap: 삽입 순서 유지, 순서가 필요한 경우 적합
  • TreeMap: 키 기준 자동 정렬(오름차순), 정렬된 데이터가 필요한 경우 적합

JShell을 활용하면 위와 같이 컴파일 과정 없이 각 Map 구현체의 동작 방식을 빠르고 간편하게 실험해 볼 수 있습니다.