Java - Map 인터페이스 및 관련 클래스
Map 인터페이스
Map 인터페이스는 데이터를 저장하기 위해서 다른 객체를 키 값으로 지정하여 key-value를 하나의 쌍으로 하여 저장하여 관리하는 Collection으로써, 키 객체의 중복을 허용하지 않지만, 데이터의 중복은 허용한다. 인덱스를 관리하지 않기 때문에 정렬 등의 작업에는 부적합하다. Map 인터페이스를 구현한 하위 클래스로는 HashMap, LinkedMap, TreeMap 이 있다.
- Map
- HashMap
- LinkedHashMap
- LinkedMap
- SortedMap
- TreeMap
Map 메소드
메소드 | 설명 |
---|---|
void clear() |
Map에 저장된 객체를 삭제한다. |
boolean containsKey(Object key) |
지정한 키(key)가 존재하는지 여부를 반환한다. |
boolean containsValue(Object value) |
지정한 값(value)이 존재하는지 여부를 반환한다. |
V get(Object key) |
지정한 키(key)에 해당하는 데이터를 반환한다. |
boolean isEmpty() |
Map이 비어 있는지의 여부를 반환한다. |
Set<K> keySet() |
key 목록을 Set 객체 형태로 반환한다. |
V put(K key, V value) |
키(key)와 값으로 구성된 새로운 데이터를 추가한다. |
void putAll(Map<? extends K, ? extends V> m) |
Map에 또 다른 Map를 추가한다. |
V remove(Object key) |
지정한 키(key)에 해당하는 데이터(value)를 삭제하고 삭제한 데이터(value)를 반환한다. |
int size() |
Map의 요소 개수를 반환한다. |
Collection<V> values() |
value 목록을 Collection 형태로 반환한다. |
V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) |
Key 값에 해당하는 Value가 존재하면 가져와서 사용하고 없으면 새로 만들어주는 패턴의 코드를 위해 Java 8에서는 이 메서드를 사용하면 짧게 구현할 수 있다. |
computeIfAbsent 메소드
Absent는 부재를 뜻하는 단어이다. 이 메소드는 Map에 해당하는 Key값이 발견되지 않을 때, Value를 넣어주는 메소드이다.
아래 예제는 Map
에서 특정 키에 해당하는 값이 존재하는지 확인한 후에 없으면 새로 넣어주는 형태의 코드이다.
Map<Key, Value> map = new HashMap();
Value value = map.get(key);
if (value == null) {
value = getNewValue(key);
map.put(key, value);
}
위에 예제 코드를 아래와 같이 computeIfAbsent
메소드를 사용하면 간략하게 작성할 수 있게 된다.
Map<Key, Value> map = new HashMap();
Value value = map.computeIfAbsent(key, k -> getNewValue(key));
HashMap 클래스
Map 계열의 Collection으로써, 데이터를 저장하기 위해 해시 테이블을 사용한다. HashMap은 데이터를 저장할 때 저장하려는 요소 외에 key 값에 해당하는 객체를 지정하며, 데이터를 얻어 올 때도 저장했던 key 값에 의해 데이터를 얻게 된다. 따라서 HashMap 객체를 생성할 때도 key값과 value값을 지정하는 생성자를 사용할 수도 있다. HashMap은 정렬 기능을 지원하지 않는다.
HashMap 예제
package com.devkuma.tutorial.java.util.collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
public class HashMapClass1 {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");
System.out.println("\n-- Example1 -----");
for (Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println("Key=" + entry.getKey() + ", Value=" + entry.getValue());
}
System.out.println("\n-- Example2 -----");
Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, String> entry = iterator.next();
System.out.println("Key : " + entry.getKey() + " Value :" + entry.getValue());
}
System.out.println("\n-- Example3 -----");
// Java8 only, forEach and Lambda
map.forEach((k, v) -> System.out.println("Key=" + k + ", Value=" + v));
System.out.println("\n-- Example4 -----");
for (Integer key : map.keySet()) {
System.out.println("key=" + key + ", value=" + map.get(key));
}
}
}
실행 결과는 아래와 같다.
-- Example1 -----
Key=1, Value=one
Key=2, Value=two
Key=3, Value=three
-- Example2 -----
Key : 1 Value :one
Key : 2 Value :two
Key : 3 Value :three
-- Example3 -----
Key=1, Value=one
Key=2, Value=two
Key=3, Value=three
-- Example4 -----
key=1, value=one
key=2, value=two
key=3, value=three
LinkedHashMap 클래스
LinkedHashMap 클래스는 HashMap 클래스를 상속한 클래스로써 입력한 순서대로 데이터를 저장 시키는 Collection이다. LinkedHashMap는 데이터를 key-value 한 쌍으로 저장되며, 데이터를 얻어 올 때도 입력한 순서대로 데이터를 얻게 된다. HashMap과는 달리 입력한 순서대로 정렬을 보장한다.
LinkedHashMap 예제
package com.devkuma.tutorial.java.util.collection;
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashMapClass {
public static void main(String[] args) {
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
map.put("11", 104);
map.put("23", 133);
map.put("32", 111);
map.put("24", 123);
map.put("15", 144);
map.put("36", 113);
for (String key : map.keySet()) {
System.out.println("key=" + key + ", value=" + map.get(key));
}
}
}
실행 결과는 아래와 같다.
key=11, value=104
key=23, value=133
key=32, value=111
key=24, value=123
key=15, value=144
key=36, value=113
TreeMap 클래스
TreeMap 클래스는 Map 인터페이스와 SortedMap 인터페이스를 구현한 클래스로써 정렬 기능이 지원되는 Map 형태의 Collection이다. TreeMap은 데이터를 key-value 한 쌍으로 저장되며, 정렬을 지원하고 데이터를 얻어 오는 속도도 빠르다. HashMap과는 달리 오름차순으로 key 값을 저장한다.
TreeMap 예제
package com.devkuma.tutorial.java.util.collection;
import java.util.Map;
import java.util.TreeMap;
public class TreeMapClass {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<String, Integer>();
map.put("11", 104);
map.put("23", 133);
map.put("32", 111);
map.put("24", 123);
map.put("15", 144);
map.put("36", 113);
for (String key : map.keySet()) {
System.out.println("key=" + key + ", value=" + map.get(key));
}
}
}
실행 결과는 아래와 같다.
key=11, value=104
key=15, value=144
key=23, value=133
key=24, value=123
key=32, value=111
key=36, value=113