Java에서 Map/Set/Hash가 헷갈린다…(1)

2026. 1. 6. 18:41·Java

Map이 Key와 Value로 저장된다는 사실은 많이 알려져 있다.

다만 Map은 컬렉션 인터페이스이기 때문에, 실제로 어떤 방식으로 동작하는지는 구현체에 따라 달라진다.

Map<Rank, Integer> result =newEnumMap<>(Rank.class);

for (Lotto lotto : userLottos) {
Rankrank= winningLotto.match(lotto);
    result.put(rank, result.getOrDefault(rank,0) +1);
}

 

Map의 핵심적인 특성은 Key가 고유하다는 점이다.

이 특성을 활용하여, 각 등수(Rank)가 몇 번 등장했는지 집계하는 용도로 Map을 사용하고 있다.

 

result.put(rank, result.getOrDefault(rank,0) +1);

 

여기서 getOrDefault는 이미 해당 Rank가 Map에 존재한다면 기존 value를 가져오고, 존재하지 않는다면 기본값 0을 반환한다. 이후 + 1을 하여 다시 put함으로써, 같은 Rank가 나올 때마다 count를 누적하는 구조가 된다.


EnumMap 이 뭘까..?

Map의 구현체로는 HashMap, TreeMap, EnumMap 등 다양한 선택지가 있지만, 이 코드에서는 EnumMap을 사용하였다. 그 이유는 Key의 성격이 Enum으로 명확하게 제한되어 있기 때문이다.

EnumMap은 Key가 반드시 Enum 타입이어야만 사용하는 전용 Map 구현체이다.

이 코드만 보더라도 winningLotto.match(lotto) 메서드는 로또 결과에 따라 Rank 타입(Enum)을 반환하, 이 Rank를 그대로 Map의 Key로 사용하고 있다. 즉, 이 Map에는 Rank 외의 다른 Key가 들어갈 여지가 없다.

 

또 하나의 중요한 특징은 EnumMap이 Enum의 선언 순서를 보장한다는 점이다.

 

Enum은 단순한 상수가 아니라 객체이며, JVM이 클래스 로딩 시점에 모든 Enum 인스턴스를 미리 생성한다. 이때 Enum 내부의 각 값들은 선언된 순서대로 0부터 시작하는 ordinal 값을 부여받는다.

 

EnumMap은 이 ordinal 값을 기반으로 내부적으로 데이터를 관리하기 때문에, Map에 값을 넣는 순서와 관계없이 항상 Enum이 선언된 순서대로 저장되고 순회된다. 즉, Key의 정렬 기준이 해시나 삽입 순서가 아니라 Enum 자체가 가진 순서가 된다.

 

이러한 특성 덕분에 등수(Rank)처럼 명확한 순서 개념을 가진 도메인에서는 문자열 비교나 별도의 정렬 로직 없이도 자연스럽게 순서 기반 처리가 가능하다. 결과적으로 EnumMap은 도메인의 순서 개념을 자료구조에 그대로 반영할 수 있는 구현체라고 볼 수 있다.


핵심 함수 간단하게 알기

map 을 쓰는 이유는 간단하다 key에 대한 value 를 매핑하거나 특정 key에 맞게 다른 짝궁을 맺어주고 싶을 때! 위의 경우는 Rank에 대한 count를 하기 위함!

 

그런데 중요한건 이런 map을 쓰면서 반드시 알아야 할 함수들이 있고 알아야 한다고 느껴서 정리한다.

넣기 빼기 얻기

map.put(key, value); //key와 value 같이 넣기 단 key가 있으면 value는 덮어씌우기 항상!
Integer value = map.get(key); // key에 해당하는 value 얻기 없다면 null
map.getOrDefault(key, defaultValue); // value 얻고 없다면 defaultValue 적용
map.remove(key); // key와 value 삭제하고 삭제된 value 반환 없으면 null
int size = map.size(); // map 자체의 크기 반환 

모아서 얻기

map.keySet();
map.values();

 

Map은 내부적으로 Key–Value 쌍(Entry)으로 구성되어 있으며, keySet()과 values()는 이 중 특정 요소들만 모아서 반환하는 메서드다. keySet()은 Map에 저장된 모든 Key들을 모아 Set 형태로 반환하고, values()는 Map에 저장된 모든 Value들을 모아 Collection 형태로 반환한다.

 

이때 반환되는 컬렉션들은 Map과 연결된 View 객체이기 때문에, 별도의 복사본이 아니라 Map의 내용을 그대로 반영한다.

반환 타입이 Collection인 이유는, Map 구현체마다 내부 구조와 순서 보장 여부가 다르기 때문에 가장 상위 인터페이스만을 노출하도록 설계되었기 때문이다.

 

필요하다면 Stream을 사용해 다음과 같이 List로 변환해 사용할 수 있다.

List<Integer> counts = map.values()
                          .stream()
                          .toList();
                          

Map 순환하기

for (Map.Entry<Rank, Integer> entry : result.entrySet()) {
    Rank rank = entry.getKey();
    int count = entry.getValue();
}

 

여기서 핵심 포인트는 entrySet()이다.

 

entrySet()은 단순히 “Key와 Value 둘 다 접근할 수 있다”라고만 설명하면 다소 모호할 수 있다.

정확히 말하면, Map은 내부적으로 Key와 Value를 하나의 단위인 Entry로 관리한다. 그리고 entrySet()은 이러한 Entry들을 여러 개 묶어 Set 형태로 반환한 것이다.

 

즉, Map의 구조는 다음과 같이 이해할 수 있다.

 

Map은 여러 개의 Entry(Key, Value)로 구성되어 있고 entrySet()은 Map에 포함된 모든 Entry들의 집합이다. 따라서 위와 같은 코드에서 Map.Entry<Rank, Integer>가 등장하는 이유는, Map 전체를 순회하는 것이 아니라 entrySet()에 포함된 Entry 하나하나를 대상으로 작업을 수행하기 때문이다.

 

for-each 문은 entrySet()에 들어 있는 Entry들을 하나씩 꺼내어, 각 Entry에 대해 getKey()와 getValue()를 통해 등수(Rank)와 해당 등수의 개수(Integer)에 동시에 접근할 수 있게 해준다.

 

결국 이 구조는 “Map 전체를 다루는 것이 아니라, Map을 구성하는 하나의 요소(Entry)를 기준으로 반복 작업을 수행한다” 라고 이해하면 된다.

'Java' 카테고리의 다른 글

Java에서 Map/Set/Hash가 헷갈린다…(3)  (1) 2026.01.06
Java에서 Map/Set/Hash가 헷갈린다…(2)  (0) 2026.01.06
Java Pattern / Matcher 정리  (0) 2025.12.29
'Java' 카테고리의 다른 글
  • Java에서 Map/Set/Hash가 헷갈린다…(3)
  • Java에서 Map/Set/Hash가 헷갈린다…(2)
  • Java Pattern / Matcher 정리
baeminn
baeminn
새로운 기술을 익히는 데 그치지 않고, 실제 문제 해결에 적용하며 구조와 한계를 함께 고민해왔습니다. 서비스 설계, 공간 데이터 분석, 도구 개발 등 다양한 프로젝트를 통해 문제 해결에 필요한 기술을 직접 선택하고 적용해 왔으며, 하나의 역할에 머무르지 않고 필요한 영역까지 책임지는 개발자로 성장하고자 합니다!
  • baeminn
    BaeLog
    baeminn
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • Programming
      • Java
      • CS
        • DB
        • OS
      • Web
      • Spring
      • GeoInfo
      • Infra N
        • Kubernates
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    데이터베이스
    I/O
    database
    poll
    set
    dbcp
    MAP
    hash
    redis
    spring
    infra
    OS
    db
    Java
    멀티플렉싱
    cs
    OOP
    sharding
    partitioning
    Datebase
    쉬운코드
    n+1
    AOP
    spring aop
    io
    replicaton
    우테코
    epoll
    select
    matcher
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
baeminn
Java에서 Map/Set/Hash가 헷갈린다…(1)
상단으로

티스토리툴바