Map vs HashMap in Java
Java에서 **Map**과 **HashMap**은 데이터의 **키-값 쌍(Key-Value Pair)**을 다루기 위한 인터페이스와 구현체입니다.
둘의 핵심 차이는 **"추상화 vs 구현체"**로 이해하면 쉽습니다. 💡
🔍 1. 기본 정의
구분 Map<K, V> HashMap<K, V>
타입 | 인터페이스(Interface) | 클래스(Class) |
패키지 | java.util.Map | java.util.HashMap |
인스턴스 생성 | 직접 생성 불가(구현체 필요) | new HashMap<>()로 바로 생성 가능 |
중복 키 | 키 중복 불가, 값은 중복 가능 | 동일 |
정렬 순서 | 정렬 순서 보장 X(구현체에 따라 다름) | 순서 보장 X |
Null 허용 | 구현체에 따라 다름 | null 키 1개, null 값 여러 개 허용 |
🛠️ 2. 핵심 관계: 인터페이스와 구현체
🔗 Map: 인터페이스
- *동작 규칙(계약)**을 정의
- 구현체에 따라 동작 방식이 달라짐
Map<String, Integer> map = new HashMap<>(); // 다형성(Polymorphism)
⚙️ HashMap: 구현 클래스
- Map 인터페이스를 구현한 대표적인 클래스
- 해시 테이블(Hash Table) 기반 → O(1) 성능(이론상)
HashMap<String, Integer> hashMap = new HashMap<>(); // 구현체 직접 사용
⚔️ 3. 주요 차이점 예제 코드
🧩 1) Map 다형성의 유연함
import java.util.*;
public class MapExample {
public static void main(String[] args) {
// Map 인터페이스 + HashMap 구현체
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 5);
map.put("Orange", 7);
System.out.println(map);
}
}
출력 예:
{Apple=10, Orange=7, Banana=5}
💡 포인트:
- Map 인터페이스를 사용하면 구현체를 자유롭게 교체 가능
- 예: HashMap → TreeMap, LinkedHashMap 변경 가능
🧩 2) HashMap 고유 특성: null 키와 값 허용
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(null, "Null Key Allowed"); // null 키 허용
hashMap.put("Key1", null); // null 값 허용
hashMap.put("Key2", "Value2");
System.out.println(hashMap);
}
}
출력 예:
{null=Null Key Allowed, Key1=null, Key2=Value2}
💡 포인트:
- HashMap은 null 키 1개, null 값 여러 개 허용
- *TreeMap*은 null 키 허용 X
🚀 4. 성능 및 내부 동작 비교
⚡ 1) 성능 특징
- HashMap: 해시 테이블 기반 → 평균 O(1) (최악 O(n))
- TreeMap: 이진 검색 트리 → O(log n)
- LinkedHashMap: 해시 테이블 + 연결 리스트 → O(1)
🔍 2) 해시 충돌 처리 (HashMap의 내부 구조)
- Java 8 이후, 체이닝(Chaining) + 레드블랙 트리(Red-Black Tree) 사용
- 해시 충돌 시 초기에 LinkedList 사용, 일정 임계점(기본 8)을 넘으면 **트리(Tree)**로 전환
🌈 5. Map 인터페이스 주요 구현체
구현체 특징 정렬 여부
HashMap | 해시 기반, 순서 보장 X, 성능 우수 | X |
TreeMap | Red-Black Tree 기반, Key 정렬 | O(정렬) |
LinkedHashMap | HashMap + 이중 연결 리스트 → 입력 순서 유지 | O(순서) |
ConcurrentHashMap | 스레드 안전(Thread-Safe) | X |
🎯 6. 언제 Map vs HashMap을 선택할까?
- 인터페이스 중심 설계 필요? → Map 사용
- 구현체 변경 가능성 낮고 성능 우선? → HashMap 사용
- 정렬 필요? → TreeMap
- 입력 순서 유지? → LinkedHashMap
- 멀티스레드 환경? → ConcurrentHashMap
🤖 마지막 한 줄 요약
- Map은 설계의 유연함을,
- HashMap은 효율적인 해시 기반 저장을 제공합니다.
'개발공부 > Java(JPA)' 카테고리의 다른 글
[JPA] JPA save() 반복 호출로 DB 커넥션 과부하 해결 (0) | 2025.02.18 |
---|---|
[JPA] for문으로 save() 할 경우 생기는 이슈 및 처리 (0) | 2025.02.18 |
[JPA] JPA에서 동기(Synchronous) vs 비동기(Asynchronous) (0) | 2025.02.17 |
[Java] String VS StringBuilder 차이점 (0) | 2025.02.17 |
JPA 란? (1) | 2025.02.13 |