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