hoon's bLog

Java Map Collection Class, 자바 맵 선언 및 사용 본문

IT/Java

Java Map Collection Class, 자바 맵 선언 및 사용

개발한기발자 2023. 8. 4. 09:39
반응형


이번 포스팅에서는 실무에서 정말 없어서는 안 될 만큼!!

이라고 강조하고 싶은 Map에 대해 얘기해볼까 한다.

Map <E> 클래스란?

  • Map 인터페이스는 Collection 인터페이스와는 다른 저장 방식을 가짐.
  • Map 컬렉션 클래스들은 키(Key)와 값(Value)을 하나의 쌍으로 저장하는 방식(key-value 방식)을 사용
  • 여기서 Key란 실질적인 값(Value)을 찾기 위한 이름의 역할
  • 요소의 저장 순서를 유지하지 않고, Key는 중복을 허용하지 않지만, 값의 중복은 허용! 

HashMap <K, V> 클래스

먼저 HashMap<K, V> 문법을 살펴보면,

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

Map<Object, Object> map = new HashMap<>();

HashMap 클래스는 Map 컬렉션 클래스에서 가장 많이 사용되는 클래스로,
JDK 1.2부터 제공되어 해시 알고리즘(hash algorithm)을 사용하여 검색 속도 매우 빠르다!

(해시 알고리즘은 차차 나중에 좀 더 깊게 살펴보기로!)
HashMap 클래스는 Map 인터페이스를 구현하므로, 중복된 Key로는 값을 저장할 수 없다.
하지만 같은 Value를 다른 Key로 저장하는 것은 가능하다!

예제를 통해 알아보면 보다 더 쉽게 알 수 있다!

// key가 String, value가 Integer인 HashMap hm 선언
HashMap<String, Integer> hm = new HashMap<String, Integer>();

// put()를 이용한 요소의 저장
hm.put("삼십", 30);
hm.put("십", 10);
hm.put("사십", 40);
hm.put("이십", 20);

// for-each문과 get()를 이용한 요소의 출력
// keySet() : Map의 전체 key를 꺼냄.
System.out.println("맵에 저장된 키들의 집합 : " + hm.keySet());
// Results : 맵에 저장된 키들의 집합 : [이십, 삼십, 사십, 십]

for (String key : hm.keySet()) {
    System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
// Results
// 키 : 이십, 값 : 20
// 키 : 삼십, 값 : 30
// 키 : 사십, 값 : 40
// 키 : 십, 값 : 10

// remove()를 이용한 요소의 제거
hm.remove("사십");

// iterator() 메서드와 get() 메서드를 이용한 요소의 출력
Iterator<String> keys = hm.keySet().iterator();

while (keys.hasNext()) {
    String key = keys.next();
    System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
// Results
// 키 : 이십, 값 : 20
// 키 : 삼십, 값 : 30
// 키 : 십, 값 : 10

// replace()를 이용한 요소의 수정
hm.replace("이십", 200);

 
for (String key : hm.keySet()) {
    System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
// Results
// 키 : 이십, 값 : 200
// 키 : 삼십, 값 : 30
// 키 : 십, 값 : 10
 

// size() 메서드를 이용한 요소의 총 개수
System.out.println("맵의 크기 : " + hm.size());
// Results: 맵의 크기 : 3

Hashtable <K, V> 클래스

Hashtable 클래스는 JDK 1.0부터 사용해 온 HashMap 클래스와 같은 동작을 하는 클래스다.
현재의 Hashtable 클래스는 HashMap 클래스와 마찬가지로 Map 인터페이스를 상속받고,
Hashtable 클래스에서 사용할 수 있는 메서드는 HashMap 클래스에서 사용할 수 있는 메서드와 거의 같다.
하지만 현재에는 기존 코드와의 호환성을 위해서만 남아있으므로,
Hashtable 클래스보다는 HashMap 클래스를 사용하는 것이 좋다고 한다!

그리고 실질적으로 HashMap을 훨씬 많이 사용하기도 함ㅎㅎ

TreeMap <K, V> 클래스

TreeMap 클래스는 키와 값을 한 쌍으로 하는 데이터를 이진 검색 트리(binary search tree)의 형태로 저장한다.
이진 검색 트리는 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.
JDK 1.2부터 제공된 TreeMap 클래스는 NavigableMap 인터페이스를
기존의 이진 검색 트리의 성능을 향상한 레드-블랙 트리(Red-Black tree)로 구현한다.
TreeMap 클래스 역시 Map 인터페이스를 구현하므로, 중복된 키로는 값을 저장할 수 없고,
같은 값을 다른 키로 저장하는 것은 가능하다.

TreeMap<Integer, String> tm = new TreeMap<Integer, String>();
 
// put() 메서드를 이용한 요소의 저장
tm.put(30, "삼십");
tm.put(10, "십");
tm.put(40, "사십");
tm.put(20, "이십");

// for-each 문과 get() 메서드를 이용한 요소의 출력
System.out.println("맵에 저장된 키들의 집합 : " + tm.keySet());
// Result: 맵에 저장된 키들의 집합 : [10, 20, 30, 40]

for (Integer key : tm.keySet()) {
    System.out.println(String.format("키 : %s, 값 : %s", key, tm.get(key)));
}
// Result
// 키 : 10, 값 : 십
// 키 : 20, 값 : 이십
// 키 : 30, 값 : 삼십
// 키 : 40, 값 : 사십

// remove() 메서드를 이용한 요소의 제거
tm.remove(40);

// iterator() 메서드와 get() 메서드를 이용한 요소의 출력
Iterator<Integer> keys = tm.keySet().iterator();

while (keys.hasNext()) {
    Integer key = keys.next();
    System.out.println(String.format("키 : %s, 값 : %s", key, tm.get(key)));
}
// Result
// 키 : 10, 값 : 십
// 키 : 20, 값 : 이십
// 키 : 30, 값 : 삼십

// replace() 메서드를 이용한 요소의 수정
tm.replace(20, "twenty");

for (Integer key : tm.keySet()) {
    System.out.println(String.format("키 : %s, 값 : %s", key, tm.get(key)));
}
// Result
// 키 : 10, 값 : 십
// 키 : 20, 값 : twenty
// 키 : 30, 값 : 삼십

// size() 메서드를 이용한 요소의 총 개수
System.out.println("맵의 크기 : " + tm.size());
// Result: 맵의 크기 : 3

HashMap <K, V> 메서드

또한 Map에서는 다양한 메서드들이 쓰이고 있다!

Map이 많이 쓰이는 만큼, Map에서 쓰이는 메서드들 또한 많이 쓰이고 있으니,

꼭 숙지하고 알아가도록 하자!

void clear() 해당 맵(map)의 모든 매핑(mapping)을 제거함.
boolean containsKey(Object key) 해당 맵이 전달된 키를 포함하고 있는지를 확인함.
boolean containsValue(Object value) 해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함.
V get(Object key) 해당 맵에서 전달된 키에 대응하는 값을 반환함.
만약 해당 맵이 전달된 키를 포함한 매핑을 포함하고 있지 않으면 null을 반환함.
boolean isEmpty() 해당 맵이 비어있는지를 확인함.
Set<K> keySet() 해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함.
V put(K key, V value) 해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함.
V remove(Object key) 해당 맵에서 전달된 키에 대응하는 매핑을 제거함.
boolean remove(Object key, Object value) 해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함.
V replace(K key, V value) 해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함.
boolean replace(K key, V oldValue, V newValue) 해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함.
int size() 해당 맵의 매핑의 총 개수를 반환함.

이렇게 Map처럼 키와 값으로 구성되는 데이터를 매핑(mapping) 또는 엔트리(entry)라고 한다!(by Java api Document)

꼭! 반드시! 알고 있도록 하자!

 

이렇게 오늘은 Map에 대해 알아봤는데,

저번 List 컬렉션 클래스에서도 말했듯, Map은 List와 더불어 정말 많이 쓰이는 컬렉션 클래스다.

때문에 많은 예제들과 쓰임들을 통해 숙달한다면, 실무에서 편하게 사용하고, 코드 해석 측면에서도 유리할지도 모르겠다!

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

끝.

Reference

http://www.tcpschool.com/java/java_collectionFramework_map

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

 

Map (Java Platform SE 8 )

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null. If the function returns null no mapping is recorded. If the function

docs.oracle.com

 

728x90
반응형