Map 인터페이스

조용근·2024년 2월 7일

자바 정리

목록 보기
20/21

Map은 키와 값 쌍으로 데이터를 저장하는 자료구조이다.

키는 유일해야 한다.
값은 중복될 수 있다.
순서를 보장하지 않는다.
단, 'LinkedHashMap'은 예외적으로 항목을 추가한 순서대로 순회할 수 있다.
HashMap은 null 키와 null 값 허용
TreeMap은 null 키와 null 값 허용 X

  • Map은 키를 통해 빠르게 데이터를 검색할 수 있도록 셜계되어 있다.

Map 인터페이스의 주요 메서드:

get(Object key): Object key는 검색하고자 하는 키이며, 메서드는 키와 연결된 값을 반환한다. 만약 키가 존재하지 않는다면 'null'을 반환한다.

put(K key, V value):
K key는 Map에 추가할 항목의 크기이다.
V value는 해당 키와 연결된 값이다.
메서드는 키에 이전에 연결되어 있던 값(V)을 반환한다. 만약 키가 존재하지 않는다면 'null'을 반환한다.

참고로,put()메서드는 키가 이미 Map에 존재하는 경우, 기존의 값을 새로운 값으로 대체한다. 새로운 키-값 쌍을 추가할 때는 해당 키에 대한 이전 값이 없으므로 'null'을 반환한다.

Map<String, Integer> map = new HashMap<>();
map.put("apple", 10); // "apple" 키에 10 값을 추가합니다.
map.put("banana", 20); // "banana" 키에 20 값을 추가합니다.

Integer appleValue = map.get("apple"); // appleValue는 10입니다.
Integer orangeValue = map.get("orange"); // orangeValue는 null입니다. "orange" 키는 Map에 존재하지 않습니다.

remove(Object key): 지정된 키와 그에 매핑된 값을 제거

containsKey(Object key): 지정된 키가 Map에 존재하는지 여부를 반환

containsValue(Object value): 지정된 값이 Map에 하나 이상 존재하는지 여부를 반환

size(): Map에 저장된 키-값 쌍의 수를 반환

isEmpty(): Map이 비어 있는지 여부를 반환

clear(): Map에서 모든 매핑을 제거

keySet(): Map에 있는 모든 키를 Set 형태로 반환

values(): Map에 있는 모든 값을 컬렉션 형태로 반환

entrySet(): Map에 있는 모든 매핑을 Map.Entry 객체의 Set 형태로 반환
이 메서드를 이용하면 Map의 모든 요소를 순회하며 각 키와 이에 해당하는 값을 접근한다.

Set<Map.Entry<K,V>> entrySet();
import java.util.HashMap;
import java.util.Map;

public class EntrySetExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 10);
        map.put("banana", 20);
        map.put("cherry", 30);

        // entrySet() 메서드를 사용하여 Map의 모든 키-값 쌍을 순회
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + ": " + value);
        }
    }
}


//entrySet()은 Map의 키-값 쌍을 Map.Entry 객체의 Set으로 반환한다.

//반환된 Set을 순회하면서 각 Entry 객체를 통해 키와 값에 접근할 수 있다.

//getKey() 메서드와 getValue() 메서드를 사용하여 각 Entry의 키와 값을 가져올 수 있다.

//entrySet() 메서드는 Map의 뷰(view)를 제공한다. 즉, entrySet()으로 반환된 Set 내의 요소를 변경하면 원본 Map도 함께 변경

Map의 구현체:

HashMap: 가장 일반적으로 사용되는 Map 구현체로, 해시 테이블을 사용하여 키-값 쌍을 저장한다. 순서를 보장하지 않는다.

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

public class HashMapExample {
    public static void main(String[] args) {
        // HashMap 생성
        Map<String, Integer> map = new HashMap<>();

        // 요소 추가
        map.put("apple", 10);
        map.put("banana", 20);
        map.put("cherry", 30);

        // 특정 키에 대한 값 조회
        System.out.println("apple의 가격: " + map.get("apple"));

        // 모든 키 출력
        System.out.println("모든 과일: ");
        for (String key : map.keySet()) {
            System.out.println(key);
        }

        // 모든 값 출력
        System.out.println("모든 가격: ");
        for (Integer value : map.values()) {
            System.out.println(value);
        }

        // 키-값 쌍 출력
        System.out.println("과일과 가격: ");
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

TreeMap: 레드-블랙 트리 기반의 NavigableMap 구현체로, 키에 따라 정렬된 순서를 보장한다.

import java.util.Map;
import java.util.TreeMap;

public class TreeMapExample {
    public static void main(String[] args) {
        // TreeMap 생성
        Map<String, Integer> treeMap = new TreeMap<>();

        // 요소 추가
        treeMap.put("apple", 10);
        treeMap.put("banana", 20);
        treeMap.put("cherry", 30);

        // 키에 따라 자동 정렬됨을 확인
        System.out.println("정렬된 과일과 가격: ");
        for (Map.Entry<String, Integer> entry : treeMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

LinkedHashMap: HashMap의 순서 보장 버전으로, 항목을 추가한 순서 또는 마지막에 접근한 순서로 순회할 수 있다.

Hashtable: HashMap과 유사하지만, 동기화된(synchronized) 메서드를 제공하여 멀티 스레드 환경에서 사용할 수 있다. 현대 자바에서는
ConcurrentHashMap을 선호한다.

ConcurrentHashMap: 멀티 스레드 환경에서 높은 동시성을 제공하는 Map이다.

멀티스레드 환경에서 여러 스레드가 동시에 Map에 접근하고 수정할 때 발생할 수 있는 동시성 문제를 해결하기 위해 설계되었다.

  • 다른 HashMap과 달리 null을 허용하지 않는다. 'Map'의 상태를 더 명확하게 하고, 스레드 안전성을 유지하는 데 도움된다.
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

        // 요소 추가
        map.put("apple", 10);
        map.put("banana", 20);

        // 요소 조회
        System.out.println(map.get("apple")); // 10 출력

        // 요소 삭제
        map.remove("apple");

        // 요소 순회
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
profile
Today I Learn

0개의 댓글