JAVA의 Map
자바에서 Map은 키와 값의 쌍을 저장하는 컬렉션입니다. 각 키는 고유한 값을 가지며, 해당 값을 검색하기 위해 키를 사용할 수 있습니다. Map은 자바 컬렉션 프레임워크의 일부이며, 사전, 연관 배열 등 다양한 사용 사례에 대한 구현을 제공합니다. Map은 특정 식별자로 데이터를 저장하고 효율적으로 검색해야하는 작업에 필수적입니다.
Map 유형
자바에서는 여러 Map 인터페이스 구현이 있으며, 각각 고유한 특성을 가지고 있습니다. 일반적으로 사용되는 몇 가지는 다음과 같습니다.
HashMap
- 버킷 배열을 사용하여 해시 테이블을 구현합니다.
- 삽입, 검색 및 삭제 작업의 평균 시간 복잡도가 빠른 O(1)을 제공합니다.
- 요소의 특정 순서를 보장하지 않습니다.
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("apple", 3);
hashMap.put("banana", 2);
hashMap.put("cherry", 5);
System.out.println(hashMap.get("banana")); // Output: 2
LinkedHashMap
- HashMap을 확장하고 삽입 순서를 유지합니다.
- 삽입, 검색 및 삭제 작업의 평균 시간 복잡도가 빠른 O(1)을 제공합니다.
- 삽입 순서를 보존해야 할 때 적합합니다.
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("apple", 3);
linkedHashMap.put("banana", 2);
linkedHashMap.put("cherry", 5);
System.out.println(linkedHashMap.keySet()); // Output: [apple, banana, cherry]
TreeMap
- Red-Black 트리를 사용하여 요소를 저장합니다.
- 자연 순서나 제공된 비교자를 기반으로 정렬된 순서로 요소를 유지합니다.
- 삽입, 검색 및 삭제 작업의 시간 복잡도는 O(log n)을 제공합니다.
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("apple", 3);
treeMap.put("banana", 2);
treeMap.put("cherry", 5);
System.out.println(treeMap.entrySet()); // Output: [apple=3, banana=2, cherry=5]
HashTable
- HashMap과 유사하지만 동기화됩니다(스레드 안전).
- 메서드에 대한 동기화된 액세스를 제공하여 스레드 안전성을 보장합니다.
- 일반적으로 전역 동기화로 인해 ConcurrentHashMap에 비해 효율이 떨어집니다.
Map<String, Integer> hashTable = new Hashtable<>();
hashTable.put("apple", 3);
hashTable.put("banana", 2);
hashTable.put("cherry", 5);
System.out.println(hashTable.containsValue(2)); // Output: true
ConcurrentHashMap
- 고도의 동시성 및 스레드 안전성을 제공합니다.
- 데이터를 세그먼트로 분할하여 여러 스레드가 다른 세그먼트에서 동시에 작업할 수 있도록 합니다.
- ConcurrentHashMap에 비해 동시 시나리오에 대해 더 나은 성능을 제공합니다.
Map<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();
concurrentHashMap.put("apple", 3);
concurrentHashMap.put("banana", 2);
concurrentHashMap.put("cherry", 5);
System.out.println(concurrentHashMap.containsKey("orange")); // Output: false
일반적인 Map 작업
요소 추가
- put(key, value) 메서드를 사용하여 키와 값의 쌍을 맵에 추가합니다.
요소 검색
- get(key) 메서드를 사용하여 특정 키와 연결된 값을 검색합니다.
요소의 존재 유무 확인
- containsKey(key) 메서드를 사용하여 키가 맵에 있는지 확인합니다.
- containsValue(value) 메서드를 사용하여 값이 맵에 있는지 확인합니다.
요소 업데이트
- 기존 키로 값을 넣으면 값이 업데이트됩니다.
요소 제거
- remove(key) 메서드를 사용하여 키-값 쌍을 맵에서 제거합니다.
맵 반복
- for-each 루프나 반복자를 사용하여 맵의 엔트리(키-값 쌍)를 반복합니다.
키와 값 가져오기
- keySet()은 모든 키의 집합을 가져옵니다.
- values()는 모든 값을 가져오는 컬렉션을 가져옵니다.
- entrySet()은 모든 키-값 쌍의 집합을 가져옵니다.
자바에서 맵은 키-값 쌍을 효율적으로 저장하고 관리할 수 있는 다용도 데이터 구조입니다. HashMap, LinkedHashMap, TreeMap, HashTable 및 ConcurrentHashMap과 같은 다양한 구현 중에서 선택할 수 있습니다. 이러한 구현은 성능, 순서 보존 여부 및 스레드 안전성 측면에서 다양한 트레이드오프를 제공합니다. 각 구현의 특성을 이해하면 자바 응용 프로그램에서 맵을 사용할 때 정보를 기반으로 더 나은 결정을 내릴 수 있습니다.