[Java] Map 인터페이스

wujin·2023년 5월 14일
0

Java Collection

목록 보기
5/5
post-thumbnail

Map 인터페이스

  • Map 인터페이스를 구현한 Map 클래스들은 키와 값을 하나의 쌍으로 저장하는 방식(key-value 방식)을 사용한다.
  • 요소의 저장 순서를 유지하지 않는다.
  • 키는 중복을 허용하지 않지만, 값의 중복은 허용한다.

Map 인터페이스는 아래와 같이 여러 구현체를 가지고 있다.

  1. HashMap<K, V>

    • 가장 일반적인 Map 구현체로, 키-값 쌍을 해시 테이블에 저장한다. 이는 null 키와 null 값을 허용하며, 동기화되지 않는다.
  2. LinkedHashMap<K, V>

    • HashMap을 확장한 클래스로, 추가 순서 또는 접근 순서에 따라 키-값 쌍을 유지한다.
  3. TreeMap<K, V>

    • 키-값 쌍을 레드-블랙 트리 구조에 저장하여 키에 대한 효율적인 정렬 순서를 유지한다.
  4. Hashtable<K, V>

    • HashMap과 유사하지만 동기화되어 있어 멀티스레드 환경에서 안전하게 사용할 수 있다. null 키 또는 null 값을 허용하지 않는다.

HashMap<K, V> 클래스

HashMap 클래스는 Map 클래스에서 가장 많이 사용되는 클래스 중 하나이다.

  • 키와 값 모두 null이 가능하다.
  • 키는 유일해야 하지만, 값은 중복될 수 있다.
  • 키-값 쌍은 삽입 순서를 유지하지 않는다.
  • 멀티스레드 환경에서는 동기화되지 않는다.

예제

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

public class Main {
    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(map);  // 출력: {Apple=10, Banana=20, Cherry=30}

        // 특정 키의 값 가져오기
        int value = map.get("Banana");
        System.out.println(value);  // 출력: 20

        // 키 존재 여부 확인
        boolean exists = map.containsKey("Apple");
        System.out.println(exists);  // 출력: true

        // 키-값 쌍 제거
        map.remove("Apple");
        System.out.println(map);  // 출력: {Banana=20, Cherry=30}
    }
}

LinkedHashMap<K, V> 클래스

LinkedHashMapHashMap을 상속받은 클래스로, Map 인터페이스를 구현한다. LinkedHashMapHashMap의 모든 기능을 가지면서 추가적으로 키-값 쌍의 삽입 순서를 유지한다. 이는 해시 테이블과 연결 리스트를 결합하여 구현된다.

  • 키와 값 모두 null이 가능하다.
  • 키는 유일해야 하지만, 값은 중복될 수 있다.
  • 키-값 쌍은 삽입 순서를 유지한다.
  • 멀티스레드 환경에서는 동기화되지 않는다.

예제

import java.util.LinkedHashMap;
import java.util.Map;

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

        // 값 추가
        map.put("Apple", 10);
        map.put("Banana", 20);
        map.put("Cherry", 30);

        // 값 출력
        System.out.println(map);  // 출력: {Apple=10, Banana=20, Cherry=30}

        // 특정 키의 값 가져오기
        int value = map.get("Banana");
        System.out.println(value);  // 출력: 20

        // 키 존재 여부 확인
        boolean exists = map.containsKey("Apple");
        System.out.println(exists);  // 출력: true

        // 키-값 쌍 제거
        map.remove("Apple");
        System.out.println(map);  // 출력: {Banana=20, Cherry=30}
    }
}

TreeMap<K, V> 클래스

TreeMapSortedMap 인터페이스를 구현한다.
TreeMap 클래스는 레드-블랙 트리(Red-Black tree)라는 자가 균형 이진 검색 트리를 기반으로 키-값 쌍을 저장한다. 이로 인해 TreeMap은 키에 대한 효율적인 정렬 순서를 유지하며, 키 또는 키-값 쌍에 대해 정렬된 순서에 따른 다양한 연산을 제공한다.

  • 키와 값 모두 null이 가능하지만, 키는 한 번만 null이 가능하며, 값은 여러 번 null이 가능하다. 그러나 트리맵에 자연적 순서를 사용하는 경우 null 키는 허용되지 않는다.
  • 키는 유일해야 하지만, 값은 중복될 수 있다.
  • 키-값 쌍은 키에 대한 정렬 순서를 유지한다. 정렬은 키의 자연적 순서 또는 생성 시 제공된 Comparator에 따라 결정된다.
  • 멀티스레드 환경에서는 동기화되지 않는다.
import java.util.Map;
import java.util.TreeMap;

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

        // 값 추가
        map.put("Apple", 10);
        map.put("Banana", 20);
        map.put("Cherry", 30);

        // 값 출력
        System.out.println(map);  // 출력: {Apple=10, Banana=20, Cherry=30}

        // 특정 키의 값 가져오기
        int value = map.get("Banana");
        System.out.println(value);  // 출력: 20

        // 키 존재 여부 확인
        boolean exists = map.containsKey("Apple");
        System.out.println(exists);  // 출력: true

        // 키-값 쌍 제거
        map.remove("Apple");
        System.out.println(map);  // 출력: {Banana=20, Cherry=30}
    }
}

Hashtable<K, V> 클래스

Hashtable 클래스는 HashMap 클래스와 같은 동작을 하는 클래스이다.
현재의 Hashtable 클래스는 HashMap 클래스와 마찬가지로 Map 인터페이스를 상속받는다. 따라서 Hashtable 클래스에서 사용할 수 있는 메소드는 HashMap 클래스에서 사용할 수 있는 메소드와 거의 같다.

하지만 현재에는 기존 코드와의 호환성을 위해서만 남아있으므로, Hashtable 클래스보다는 HashMap 클래스를 사용하는 것이 좋다.

0개의 댓글