Menu

Java HashMap: put, get, 순회, 자주 쓰는 패턴

키-값 조회에 Java의 HashMap을 사용하는 방법: put, get, getOrDefault, containsKey, 엔트리 순회, 그리고 가장 자주 사용하게 되는 패턴들.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

Map은 키-값 쌍을 저장한다

HashMap(java.util 소속)은 연관 관계를 저장합니다. 각 는 하나의 에 매핑되며, 키를 사용해 거의 상수 시간에 값을 조회합니다. 사전을 떠올려 보세요. 단어가 키이고 정의가 값입니다.

두 개의 타입 매개변수는 <KeyType, ValueType>입니다. 여기서 키는 String이고 값은 Integer입니다. ArrayList와 마찬가지로, 보통 변수는 Map 인터페이스 타입으로 선언하고 HashMap을 생성합니다.

put, get, 덮어쓰기

기억해 둘 두 가지:

  • 키는 고유합니다. 기존 키로 put하면 그 값을 교체하고 이전 값을 반환합니다.
  • 없는 키로 get하면 에러가 아니라 null을 반환합니다. 그 nullint로 자동 언박싱하면 NullPointerException이 발생하는데, 이는 흔한 버그의 원인입니다.

getOrDefault는 null 함정을 피한다

매번 null을 확인하는 대신 기본값을 요청하세요:

이것은 "있을 수도 있는" 조회를 처리하는 가장 깔끔한 방법이며, 가장 유명한 HashMap 패턴으로 곧장 이어집니다.

출현 횟수 세기

각 항목이 몇 번 나타나는지 세는 것은 HashMap의 교과서적 작업입니다:

map.put(key, map.getOrDefault(key, 0) + 1) 패턴은 "현재 카운트(또는 0)를 가져와 1을 더한 뒤 다시 저장한다"로 읽힙니다. 더 깔끔한 등가 표현은 counts.merge(word, 1, Integer::sum)입니다.

확인과 제거

putIfAbsent(key, value)는 키가 없을 때만 기록합니다. 지연 초기화에 유용합니다.

HashMap 순회하기

가장 흔한 루프는 entrySet()을 따라가며 각 키와 값을 함께 제공합니다:

키만 또는 값만 필요한 경우:

람다와 함께 forEach를 사용할 수도 있습니다: ages.forEach((name, age) -> System.out.println(name + ": " + age));.

HashMap은 순서를 유지하지 않는다

HashMap은 순회 순서에 대해 아무것도 보장하지 않습니다. 순서는 해싱이 만들어내는 것이며 실행마다 달라질 수 있습니다. 예측 가능한 순서가 필요하다면:

  • **LinkedHashMap**은 삽입 순서를 보존합니다.
  • **TreeMap**은 키를 자연 순서(또는 제공한 Comparator)로 정렬해 유지합니다.

셋 다 Map 인터페이스를 구현하므로, 전환은 생성자 한 줄만 바꾸면 됩니다.

키는 해시 가능해야 한다

HashMap은 키를 해싱해 엔트리를 찾으므로, 키의 hashCode()equals()는 서로 일관되어야 합니다. String이나 Integer 같은 내장 타입은 이미 올바르게 구현되어 있습니다. 직접 만든 클래스를 키로 사용한다면 equalshashCode를 모두 오버라이드하세요. 그렇지 않으면 의미상 "같은" 두 객체가 서로 다른 버킷에 들어가, 조회가 알 수 없는 이유로 실패하게 됩니다.

다음: HashSet

HashMap은 "이 키 아래에 어떤 값이 저장되어 있는가?"에 답합니다. 무언가가 존재하는지 여부만 신경 쓸 때(연관된 데이터 없이 고유한 값들의 집합), 사용할 도구는 HashSet이며, 이것이 다음 주제입니다.

자주 묻는 질문

Java에서 HashMap을 어떻게 만드나요?

두 개의 타입 매개변수(키 타입과 값 타입)로 선언하고 생성자를 호출합니다: Map<String, Integer> ages = new HashMap<>();. 그런 다음 ages.put("Ada", 36);으로 엔트리를 추가하고 ages.get("Ada");로 읽습니다. java.util.HashMapjava.util.Map을 import 하세요.

Java에서 HashMap을 어떻게 순회하나요?

for-each 루프로 map.entrySet()을 순회하면 각 키와 값을 함께 얻을 수 있습니다: for (Map.Entry<String, Integer> e : map.entrySet()) { ... }. 그리고 e.getKey()e.getValue()로 읽습니다. 키만 필요하면 map.keySet()을, 값만 필요하면 map.values()를 순회할 수도 있습니다. HashMap은 삽입 순서를 유지하지 않는다는 점에 유의하세요.

get과 getOrDefault의 차이는 무엇인가요?

get(key)는 키에 대한 값을 반환하지만 키가 없으면 null을 반환하므로, 결과를 그대로 사용하면 NullPointerException으로 이어질 수 있습니다. getOrDefault(key, fallback)는 값이 있으면 그 값을, 없으면 전달한 기본값을 반환하므로 null 검사를 피할 수 있습니다. 특히 카운팅에 유용합니다: counts.put(c, counts.getOrDefault(c, 0) + 1).

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기