JShell은 Java 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 구현체의 동작 방식을 빠르고 간편하게 실험해 볼 수 있습니다.