java/공부

Java Map이란(Hash Map)

sungin95 2023. 7. 27. 17:07

Map

Map은 Key와 Value 한쌍으로 이루어진 자료형입니다. 

이때 Key는 중복을 허용하지 않습니다. Key를 통해 Value를 찾는데. Key값이 중복이 된다면 찾을 수 없기 때문입니다. 

 

만약 Python을 알고 있으시다면 Dict(딕셔너리)랑 비슷하다고 생각하시면 됩니다. 

import java.util.Map;
import java.util.HashMap;

java.util을 통해 임폴트 할 수 있습니다. 

 

 

Map은 인터페이스이고 HashMap, Hashtable, TreeMap 3가지 구현 클래스를 가지고 있습니다. 

이중 Hashtable은 "기존 코드와의 호환성을 위해서만 남아있으므로, Hashtable 클래스보다는 HashMap 클래스를 사용하는 것이 좋다." 라는 말이 있어서 생략하고

HashMap과 TreeMap에 대해서 알아보겠습니다. 

이 둘의 가장 큰 차이점은 구조가 다르다는 점입니다. 

HashMap

가장 일반적으로 사용하는 클래스로 HashMap은 내부적으로 Entry<K,V>[] Entry Array로 구성되어 있다. Array의 index를 hash 함수를 통혜 계산한다.

위 그림처럼 Entry로 저장이 되는데, 내부적으로 Hash 값에 의해 어떤 Bucket에 담길지 결정이 된다.

만약 Hash 값이 같다면 같은 Bucket에 List로 연결될 것이다.(마치 LinkedList처럼 Entry 안에 next Entry를 저장하는 변수가 있음)

Hash 값을 이용하여 저장하기 때문에 순서를 보장하지 않는다. get() 메서드는 Hash 값으로 해당 Array에 바로 접근이 가능하기 때문에 성능은 O(1)으로 빠르다.

 

TreeMap

TreeMap은 HashMap과 다르게 Entry가 Tree 구조로 저장되어 있는 것이 특징이다.

 

위 그림처럼 Tree 구조를 가지는데, Tree 구조 특성상 특정 Entry를 접근하려면 O(logn) 성능을 보인다.
TreeMap은 SortedMap 인터페이스를 구현하고 있어 Key 값을 기준으로 정렬이 되어 있는데, 이는 Comparator를 구현하여 정렬 순서를 변경할 수 있다.

 

요약하면 Key값을 기준으로 정렬이 필요하면 TreeMap을 사용하고 나머지 상황에서는 HashMap을 사용하시면 됩니다. 

 

메소드

자바의 맵(Map)중 가장 기본적인 HashMap을 통해서 알아보자.

HashMap을 통해 예시를 든 이유는 boolean isEmpty() 를 제외하고는 HashMap의 모든 메소드는 TreeMap에 포함되어 있어서 입니다. 

put

key와 value가 String 형태인 HashMap을 만들고 위에서 보았던 예제의 항목값들을 입력해 보자.

import java.util.HashMap;

public class Sample {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("people", "사람");
        map.put("baseball", "야구");
    }
}

key와 value는 위 예제에서 보듯이 put 메서드를 이용하여 추가할 수 있다.

HashMap 역시 제네릭스를 이용한다. 위의 HashMap의 제네릭스는 Key, Value 모두 String 타입이다. 따라서 Key, Value에 String 이외의 자료형은 사용할수 없다.

get

key에 해당하는 value값을 얻기 위해서는 get 메서드를 사용한다.

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

map 객체의 키(Key) "people" 에 대응하는 값(Value) "사람"이 출력된다.

점프 투 자바getOrDefault

맵의 key에 해당하는 value가 없을 경우에 get 메서드를 사용하면 다음처럼 null이 리턴된다.

System.out.println(map.get("java"));  // null 출력
null

null 대신 디폴트 값을 얻고 싶은 경우에는 getOrDefault 메서드를 사용한다.

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

containsKey

containsKey 메서드는 맵(Map)에 해당 키(key)가 있는지를 조사하여 그 유무를 참, 거짓으로 리턴한다.

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

"people"이라는 키는 존재하므로 true가 출력된다.

remove

remove 메서드는 맵(Map)의 항목을 삭제하는 메서드로 key값에 해당되는 아이템(key, value)을 삭제한 후 그 value 값을 리턴한다.

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

"people"에 해당되는 Key, Value 쌍이 삭제된 후 "사람"이 출력된다.

size

size 메서드는 Map의 갯수를 리턴한다.

System.out.println(map.size());
1

"people", "baseball" 두 값을 가지고 있다가 "people"항목이 삭제되었으므로 1이 출력된다.

keySet

keySet은 맵(Map)의 모든 Key를 모아서 리턴한다.

import java.util.HashMap;

public class Sample {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("people", "사람");
        map.put("baseball", "야구");
        System.out.println(map.keySet());  // [baseball, people] 출력
    }
}
[baseball, people]

keySet() 메서드는 Map의 모든 Key를 모아서 Set 자료형으로 리턴한다. Set 자료형은 잠시후에 알아본다. Set 자료형은 다음과 같이 List 자료형으로 바꾸어 사용할수도 있다.

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

 

 

더 많은 메서드를 참고할거면 아래 블로그를 확인해 보자

https://2ham-s.tistory.com/197

 

Java-Map이란? Map의 종류

Map 컬렉션 클래스 Map 인터페이스는 Collection 인터페이스와는 다른 저장 방식을 가집니다. Map 인터페이스를 구현한 Map 컬렉션 클래스들은 키와 값을 하나의 쌍으로 저장하는 방식(key-value 방식)을

2ham-s.tistory.com

 

 

 

 

참고자료

https://velog.io/@dongeranguk/JAVA-Map%EC%9D%B4%EB%9E%80

 

[JAVA] Map이란?

Map은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 Key를 통해 Value를 얻는다.값(Value)은 중복될 수 있지만, Key는 고유한 값(Unique)을 가져야 한다.Map은 저장 순서를 유지할 필요가 없

velog.io

https://onsil-thegreenhouse.github.io/programming/java/2018/02/22/java_tutorial_1-24/

 

[Java] 자바의 자료구조 - Map(HashMap, TreeMap) - Onsil's blog

초짜 개발자 온실의<br> 스터디 블로그

onsil-thegreenhouse.github.io

https://beknazarsuranchiyev.medium.com/map-in-java-38070ec75bea

 

Map in Java

The map is a set of key-value mappings. The keys are unique.

beknazarsuranchiyev.medium.com

https://devlogofchris.tistory.com/41

 

[JAVA]Map이란? (HashMap, Hashtable, TreeMap)

Map 컬렉션 클래스 Map 인터페이스는 Collection 인터페이스와는 다른 저장 방식을 가집니다. Map 인터페이스를 구현한 Map 컬렉션 클래스들은 키와 값을 하나의 쌍으로 저장하는 방식(key-value 방식)을

devlogofchris.tistory.com

https://tomining.tistory.com/168

 

HashMap, TreeMap 그리고 LinkedHashMap의 차이

최근 어떤 기회로 TreeMap과 HashMap은 어떤 차이가 있는지에 대한 질문을 받았다. 과거 Java 책에서 관련 내용을 본 적은 있으나 잘 기억이 나질 않았다. 특별한 경우를 제외하고는 HashMap을 주로 사용

tomining.tistory.com