본문 바로가기
언어/Java

[자바] + 맵

by taeung515 2025. 4. 8.

자바의 Map 인터페이스는 키(key)와 값(value)의 쌍으로 데이터를 저장하는 구조를 제공한다. 각 키는 고유하며, 해당 키를 통해 연관된 값을 효율적으로 검색하거나 수정할 수 있다.

 

리스트와 배열과 다르게 맵은 순차적으로(sequential) 요솟값을 구하지 않고 키(key)를 이용해 값(value)을 얻는다.

 

맵에는 여러가지가 있지만 그중 가장 기본인 HashMap에 대해 알아보자.

HashMap은

Java에서 가장 많이 사용하는 Map 구현체 중 하나다. 키(key)와 값(value)을 하나의 쌍으로 저장하며, 이 쌍을 "엔트리(entry)"라고 부른다.

 

HashMap은 내부적으로 해시 테이블을 사용하여 데이터를 저장한다. 이 해시 테이블 덕분에 키를 이용한 검색, 삽입, 삭제 등의 작업이 평균적으로 매우 빠르다. 

 

HashMap에 데이터를 저장할 때는 put(key, value) 메서드를 사용하고, 값을 조회할 때는 get(key) 메서드를 사용한다. 특정 키가 존재하는지 확인하려면 containsKey(key)를, 특정 값이 존재하는지 확인하려면 containsValue(value)를 사용한다.

 

키는 중복될 수 없지만, 값은 중복될 수 있다. 즉, 하나의 HashMap에는 같은 키가 두 번 이상 존재할 수 없으며, 만약 이미 존재하는 키로 새로운 값을 넣으면 기존의 값은 덮어씌워진다.

 

예를 들어

HashMap<String, String> capitalCities = new HashMap<>();

capitalCities.put("Korea", "Seoul");
capitalCities.put("Japan", "Tokyo");
capitalCities.put("USA", "Washington D.C.");

// 같은 키에 다른 값 넣기
capitalCities.put("Korea", "Busan");

System.out.println(capitalCities.get("Korea")); 

/* Busan만 출력됨 기존값을 덮어씀. HashMap은 말 그대로"순서가 없다."
즉, 전체를 출력할 때(keySet, entrySet 등), 어떤 순서로 나올지 보장되지 않음 */

 

HashMap은 순서를 보장하지 않는다. 저장한 순서대로 데이터가 출력되지 않으며, 이는 내부 해시 구조 때문임을 이해해야 한다.

만약 입력 순서를 유지하고 싶다면 LinkedHashMap을 사용하고, 키의 정렬이 필요하다면 TreeMap을 사용하는 것이 적절하다.

 

스레드 안전하지 않기 때문에, 멀티스레드 환경에서 사용할 경우에는 Collections.synchronizedMap()이나 ConcurrentHashMap과 같은 대안을 고려해야 한다.

 

정리하자면, HashMap은 빠르고 효율적인 키-값 기반 데이터 저장에 매우 적합하며, Java 컬렉션 프레임워크에서 자주 사용되는 중요한 클래스다.

 

주요 메서드

더보기

주요 메서드

put(key, value)

put 메서드는 키와 값을 추가할 때 사용한다. 키가 이미 존재할 경우, 해당 키의 값은 새 값으로 덮어쓰기 된다.

HashMap<String, String> map = new HashMap<>();
map.put("people", "사람");
map.put("baseball", "야구");

HashMap은 제네릭스를 이용하여 키와 값의 자료형을 지정할 수 있다. 위 예제에서는 키와 값 모두 String 타입이다.


get(key)

get 메서드는 지정한 키에 해당하는 값을 가져올 때 사용한다.

System.out.println(map.get("people"));  // 사람 출력

해당 키가 존재하지 않으면 null을 반환하게 된다.


getOrDefault(key, defaultValue)

getOrDefault는 키가 존재하지 않을 때 기본값을 지정하여 반환할 수 있도록 한다.

System.out.println(map.getOrDefault("java", "자바"));  // 자바 출력

이 메서드는 null 방지에 유용하게 활용할 수 있다.


containsKey(key)

containsKey는 특정 키가 존재하는지를 확인할 수 있는 메서드이다. 반환값은 true 또는 false이다.

System.out.println(map.containsKey("people"));  // true 출력

remove(key)

remove는 특정 키를 삭제하고, 해당 키에 대응하는 값을 반환한다.

System.out.println(map.remove("people"));  // 사람 출력

삭제된 후에는 해당 키와 값이 HashMap에서 제거된다.


size()

size는 HashMap에 저장된 키-값 쌍의 개수를 반환한다.

System.out.println(map.size());  // 1 출력

항목이 삭제되거나 추가됨에 따라 크기도 함께 변하게 된다.


keySet()

keySet 메서드는 HashMap에 있는 모든 키를 집합(Set) 형태로 반환한다.

System.out.println(map.keySet());  // [baseball] 출력

필요하다면 아래처럼 리스트로 변환하여 사용할 수 있다:

ArrayList<String> keyList = new ArrayList<>(map.keySet());

마무리

HashMap은 키를 통해 빠르게 값을 검색할 수 있으며, 다양한 메서드를 통해 데이터를 효율적으로 다룰 수 있게 해준다. 순서가 필요 없다면 HashMap을, 입력 순서 유지가 필요하다면 LinkedHashMap을, 정렬이 필요하다면 TreeMap을 사용하도록 한다.

 

Map.of() vs HashMap 비교

Java 버전 Java 9 이상 Java 1.2 이상
값 추가/수정 불가능 (불변) 가능
사용 목적 고정된 데이터 빠르게 선언 동적으로 값 추가/삭제
코드 길이 짧고 간결 조금 길지만 유연
Map<String, Integer> beverages = Map.of(
    "사이다", 1700,
    "콜라", 1900,
    "식혜", 2500,
    "솔의눈", 3000
);

수정이 어려움. 가벼운 데이터일때 사용.

 

 

Map이 언제 유용할까?

  • 학생 이름 → 점수
  • 상품 이름 → 가격
  • 단어 → 번역된 단어
  • 사용자 ID → 객체 정보

검색하고 대응시키는 상황에서 엄청 강력한 도구

 

 

 

 

 

 

cf) 

LinkedHashMap과 TreeMap

맵의 가장 큰 특징은 순서에 의존하지 않고 key로 value를 가져오는 것이다. 그런데 가끔 Map에 입력된 순서대로 데이터를 가져오거나 입력한 key에 의해 정렬(sort)하도록 저장하고 싶을 수 있다. 이럴때는 LinkedHashMap과 TreeMap을 사용하면 된다.

  • LinkedHashMap : 입력된 순서대로 데이터를 저장한다.
  • TreeMap : 입력된 key의 오름차순으로 데이터를 저장한다.

'언어 > Java' 카테고리의 다른 글

[자바] + OOP 다형성  (0) 2025.04.18
[자바] +자바 메모리 구조  (0) 2025.04.15