[Java] 컬렉션 프레임워크(5) - Map 인터페이스

sobam·2022년 9월 29일
0

자바

목록 보기
8/18
post-thumbnail

📔 학습한 내용을 정리하기 위해 작성하는 게시글입니다.

🔑Map<K, V> 인터페이스


특징


  • Collection<E> 인터페이스를 상속받는 List<E>, Set<E>와 달리, 별도의 인터페이스로 존재함

  • Key와 Value를 한 쌍으로 데이터를 저장(엔트리)
    → Key의 중복 허용 X, Value의 중복 허용 O
    → Key는 고유값, Value없이 Key만 저장 가능(Key없이 Value만 저장 불가)

  • 저장 순서가 유지되지 않음(비정렬)

  • 삽입, 삭제, 조회 연산이 빠르지만 순서가 보장되지 않고 정렬이 불가능함

  • Map<K, V>인터페이스를 구현한 대표적인 클래스로는 HashMap<K, V>, Hashtable<K, V>, TreeMap<K, V>가 있음

Key와 Value 한 쌍의 데이터를 엔트리(Entry)라고 하며, Map.Entry 타입으로 정의된다.



Map<K, V> 인터페이스에서 사용되는 주요 메서드



구분리턴 타입메서드명기능
데이터 추가Vput(K key, V value)입력매개변수의 (key, value)를 Map 객체에 추가
voidputAll(Map<? extends K, ? extends V> m)입력매개변수의 Map 객체를 통째로 추가
데이터 변경Vreplace(K key, V value)Key에 해당하는 값을 Value 값으로 변경(old값 리턴) (단, 해당 Key가 없으면 null 리턴)
booleanreplace(K key, V oldValue, V newValue)(key, oldValue)의 쌍을 갖는 엔트리에서 oldValue를 newValue로 변경(단, 해당 엔트리가 없으면 false를 리턴)
데이터 정보 추출Vget(Object key)매개변수의 Key 값에 해당하는 oldValue를 리턴
booleancontainsKey(Object key)매개변수의 Key 값이 포함돼 있는지 여부
booleancontainsValue(Object value)매개변수의 Value 값이 포함돼 있는지 여부
SetkeySet()Map 데이터들 중 key들만 뽑아 Set 객체로 리턴
Set<Entry<K, V>>entrySet()Map의 각 엔트리들을 Set 객체로 담아 리턴
intsize()Map에 포함된 엔트리의 개수
데이터 삭제Vremove(Object key)입력매개변수의 Key를 갖는 엔트리 삭제(단, 해당 Key가 없으면 아무런 동작을 하지 않음)
booleanremove(Object key, Object value)입력매개변수의 (key, value)를 갖는 엔트리 삭제(단, 해당 엔트리가 없으면 아무런 동작을 하지 않음)
voidclear()Map 객체 내의 모든 데이터 삭제



1. HashMap<K, V>


Map<K, V> 객체명 = new HashMap<K, V>();
  • Map<K, V> 인터페이스를 구현한 대표적인 구현 클래스(HashTable<K, V>의 신버전)
  • 내부적으로 해시 알고리즘에 의해 구현됨
  • Key 값의 중복을 허용하지 않음(Key 값의 중복 여부를 확인하는 메커니즘은 HashSet<E>의 경우와 완전히 동일)
  • 검색 속도가 매우 빠름, 정렬 불가능, 입출력 순서가 일치하지 않음
  • Key 값을 HashSet<E>로 구현한 Map<K, V> 객체
  • 검색을 위한 자료구조
  • 저장 용량(capacity)의 기본값은 16

해시 알고리즘(hash algorithm)이란?

해시 함수(hash function)를 사용하여 데이터를 해시 테이블(hash table)에 저장하고, 다시 그것을 검색하는 알고리즘


HashMap 예제

public class Ex14_HashMap {
	public static void main(String[] args) {
		HashMap<String, String> map = new HashMap<>();
		
		//Key-Value 기반 데이터 저장
		map.put("홍길동", "010-1234-1443");
		map.put("전우치", "010-4321-1446");
		map.put("손오공", "010-9876-1443");
		
		//데이터 탐색
		System.out.println("홍길동: " + map.get("홍길동"));
		System.out.println("전우치: " + map.get("전우치"));
		System.out.println("손오공: " + map.get("손오공"));
		System.out.println();
		
		//데이터 삭제
		map.remove("손오공");
		
		//데이터 삭제 확인
		System.out.println("손오공: " + map.get("손오공"));
		
	}
}

HashMap 예제 출력

홍길동: 010-1234-1443
전우치: 010-4321-1446
손오공: 010-9876-1443

손오공: null


2. HashTable<K, V>


Map<K, V> 객체명 = new Hashtable<K, V>();
  • HashMap<K, V> 구현 클래스가 단일 쓰레드에 적합한 반면, HashTable은 멀티 쓰레드에 안정성을 가짐
  • 위 특징을 제외하고는 HashMap<K, V>과 동일한 특징을 가짐


3. LinkedHashMap<K, V>


Map<K, V> 객체명 = new LinkedHashMap<K, V>();
  • HashMap<K, V>의 기본적인 특성에 입력 데이터의 순서 정보를 추가로 갖고 있는 컬렉션
  • 출력 순서와 입력 순서가 동일(데이터가 입력된 순서로 출력됨)
  • Key를 LinkedHashSet<E>로 관리함
  • 정렬 불가능


4. TreeMap<K, V>


Map<K, V> 객체명 = new TreeMap<K, V>(); → Map<K, V> 메서드만 사용 가능
TreeMap<K, V> 객체명 = new TreeMap<K, V>(); → Map<K, V> 메서드와 추가된 정렬/검색 메서드 사용 가능
  • Map<K, V>의 기본 기능에 정렬(Key값의 크기에 따라 오름차순 정렬) 및 검색 기능이 추가된 컬렉션
    → 반드시 Key 객체는 크기 비교의 기준을 가져야 함
  • 이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장함
  • 다른 클래스와 달리 NavigableMap<K, V>SortedMap<K, V>를 부모 인터페이스로 둠
    TreeMap<K, V> 생성자로 객체를 생성해도 Set<K, V> 타입으로 선언하면 정렬 및 검색 기능 사용 할 수 없음
  • 범위 검색, 정렬에 유리한 컬렉션 클래스
  • HashMap<K, V>보다 데이터 추가, 삭제 시간이 오래 소요
  • key 사용되는 클래스에 Comparable, Comparator 인터페이스를 구현
  • 정렬 가능
  • TreeMap<K, V> 정렬 기준 : 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글

이진 탐색 트리(Binary Search Tree, BST)란?

Set 인터페이스 참고


TreeMap 예제

//key, value값 출력 방법은 HashMap도 동일함
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class Ex16_TreeMapKeySet {
	public static void main(String[] args) {
		TreeMap<String, Integer> map = new TreeMap<>();
		
		//Key-Value 기반 데이터 저장
		map.put("홍길동", 20);
		map.put("전우치", 25);
		map.put("손오공", 27);
		
		//Key만 담고 있는 컬렉션 인스턴스 생성
		Set<String> ks = map.keySet();
		
		//전체 Key 출력(향상된 기능의 for문 기반)
		for(String s : ks)
			System.out.print(s + '\t');
		System.out.println();
		
		//전체 Value 출력(향상된 기능의 for문 기반)
		for(String s : ks)
			System.out.print(map.get(s).toString() + '\t');
		System.out.println();
		
		//전체 Value 출력(반복자 기반)
		for(Iterator<String> itr = ks.iterator(); itr.hasNext();)
			System.out.print(map.get(itr.next()).toString() + '\t');
		System.out.println();
	}
}

TreeMap 예제 출력

손오공	전우치	홍길동	
27	25	20	
27	25	20	


4. HashMap vs. HashTable vs. LinkedHashMap vs. TreeMap


컬렉션데이터 중복(K, V)저장 순서 유지정렬구현 방식동기화 지원
HashMap<K, V>(X, O)X(임의 순서로 저장)불가능LinkedList로 연결된 배열X
HashTable<K, V>(X, O)X(임의 순서로 저장)불가능LinkedList로 연결된 배열O
LinkedHashMap<K, V>(X, O)O(FIFO, 선입선출)불가능double-linked bucketX
TreeMap<K, V>(X, O)O(오름차순)Key를 기준으로 오름차순으로 정렬Red-Black-Tree(*key는 Comparable 구현)X

Map을 써야하는데 정렬이 불가피하다면 TreeMap,
Map을 써야하는데 정렬은 필요없지만 삽입순서를 기억해야한다면 LinkedHashMap, 그 외에는 가장 효율적이고 빠른 HashMap을 기본적으로 사용한다.

(HashTable은 과거에 사용하던 클래스로 현재는 더 이상 지원하지 않는 클래스이니 사용을 지양하는것이 좋다.)




🔔 Referance

<이재환의 자바 프로그래밍 입문>
<Do it! 자바 완전 정복>
http://www.tcpschool.com/java/java_collectionFramework_set
https://bangu4.tistory.com/205
https://hwan1001.tistory.com/10
https://escapefromcoding.tistory.com/143

0개의 댓글

관련 채용 정보