Java Map이란(Hash Map)
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 구조로 저장되어 있는 것이 특징이다.
요약하면 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
참고자료
https://velog.io/@dongeranguk/JAVA-Map%EC%9D%B4%EB%9E%80
https://onsil-thegreenhouse.github.io/programming/java/2018/02/22/java_tutorial_1-24/
https://beknazarsuranchiyev.medium.com/map-in-java-38070ec75bea
https://devlogofchris.tistory.com/41
https://tomining.tistory.com/168