본문 바로가기

개발공부/Java(JPA)

[Java] Map 과 HashMap의 차이점!

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을 선택할까?

  1. 인터페이스 중심 설계 필요? → Map 사용
  2. 구현체 변경 가능성 낮고 성능 우선? → HashMap 사용
  3. 정렬 필요? → TreeMap
  4. 입력 순서 유지? → LinkedHashMap
  5. 멀티스레드 환경? → ConcurrentHashMap

🤖 마지막 한 줄 요약

  • Map은 설계의 유연함을,
  • HashMap은 효율적인 해시 기반 저장을 제공합니다.