Language/Java

[Java] 자바 컬렉션 프레임워크 - Map 컬렉션 클래스

재은초 2024. 4. 14. 21:46
반응형

Map 컬렉션 클래스

  • Map 인터페이스는 Collection 인터페이스와는 다른 저장 방식을 가진다.
  • Map 인터페이스를 구현한 Map 컬렉션 클래스들은 키와 값을 하나의 쌍으로 저장하는 방식(key-value 방식)을 사용한다. 여기서 키(key)란 실질적인 값(value)을 찾기 위한 이름의 역할을 한다.
  • Map 인터페이스를 구현한 모든 Map 컬렉션 클래스는 다음과 같은 특징을 가진다.
    • 1. 요소의 저장 순서를 유지하지 않는다.
    • 2. 키는 중복을 허용하지 않지만, 값의 중복은 허용한다. 
  • 대표적인 Map 컬렉션 클래스에 속하는 클래스는 1. HashMap<K, V>, 2. Hashtable<K, V>, 3. TreeMap<k, v></k, v>과 같다.

HashMap<K, V> 클래스

  • HashMap 클래스는 Map 컬렉션 클래스에서 가장 많이 사용되는 클래스 중 하나다.
  • JDK 1.2부터 제공된 HashMap 클래스는 해시 알고리즘(hash algorithm)을 사용하여 검색 속도가 매우 빠르다. HashMap 클래스는 Map 인터페이스를 구현하므로, 중복된 키로는 값을 저장할 수 없지만 같은 값을 다른 키로 저장하는 것은 가능하다.
HashMap<String, Integer> hm = new HashMap<String, Integer>();
 
// put() 메소드를 이용한 요소의 저장
hm.put("삼십", 30);
hm.put("십", 10);
hm.put("사십", 40);
hm.put("이십", 20);
 
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
System.out.println("맵에 저장된 키들의 집합 : " + hm.keySet());
// keySet() 메소드는 해당 맵에 포함된 모든 키 값들을 하나의 집합(Set)으로 반환
for (String key : hm.keySet()) {
    System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
 
// remove() 메소드를 이용한 요소의 제거
hm.remove("사십");
 
// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
Iterator<String> keys = hm.keySet().iterator();
while (keys.hasNext()) {
    String key = keys.next();
    System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
 
// replace() 메소드를 이용한 요소의 수정
hm.replace("이십", 200);
 
for (String key : hm.keySet()) {
    System.out.println(String.format("키 : %s, 값 : %s", key, hm.get(key)));
}
 
// size() 메소드를 이용한 요소의 총 개수
System.out.println("맵의 크기 : " + hm.size());

>> 맵에 저장된 키들의 집합 : [이십, 삼십, 사십, 십]
>> 키 : 이십, 값 : 20
>> 키 : 삼십, 값 : 30
>> 키 : 사십, 값 : 40
>> 키 : 십, 값 : 10
>>  
>> 키 : 이십, 값 : 20
>> 키 : 삼십, 값 : 30
>> 키 : 십, 값 : 10
>>  
>> 키 : 이십, 값 : 200
>> 키 : 삼십, 값 : 30
>> 키 : 십, 값 : 10
>> 
>> 맵의 크기 : 3

HashMap<K, V> 메소드

  • 자바 공식 문서에서는 키와 값으로 구성되는 데이터를 매핑(mapping) 또는 엔트리(entry)라고 기술한다.

Hashtable<K, V> 클래스

  • Hashtable 클래스는 JDK 1.0부터 사용해 온 HashMap 클래스와 같은 동작을 하는 클래스다.
  • 현재의 Hashtable 클래스는 HashMap 클래스와 마찬가지로 Map 인터페이스를 상속받는다. 따라서 Hashtable 클래스에서 사용할 수 있는 메소드는 HashMap 클래스에서 사용할 수 있는 메소드와 거의 같다. 하지만 현재에는 기존 코드와의 호환성을 위해서만 남아있으므로, Hashtable 클래스보다는 HashMap 클래스를 사용하는 것이 좋다.

TreeMap<K, V> 클래스

  • TreeMap 클래스는 키와 값을 한 쌍으로 하는 데이터를 이진 검색 트리(binary search tree)의 형태로 저장한다. 이진 검색 트리는 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.
  • JDK 1.2부터 제공된 TreeMap 클래스는 NavigableMap 인터페이스를 기존의 이진 검색 트리의 성능을 향상시킨 레드-블랙 트리(Red-Black tree)로 구현한다.
  • TreeMap 클래스는 Map 인터페이스를 구현하므로 중복된 키로는 값을 저장할 수 없지만, 같은 값을 다른 키로 저장하는 것은 가능하다.
TreeMap<Integer, String> tm = new TreeMap<Integer, String>();
 
// put() 메소드를 이용한 요소의 저장
tm.put(30, "삼십");
tm.put(10, "십");
tm.put(40, "사십");
tm.put(20, "이십");
 
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
System.out.println("맵에 저장된 키들의 집합 : " + tm.keySet());
for (Integer key : tm.keySet()) {
    System.out.println(String.format("키 : %s, 값 : %s", key, tm.get(key)));
}
 
// remove() 메소드를 이용한 요소의 제거
tm.remove(40);
 
// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
Iterator<Integer> keys = tm.keySet().iterator();
while (keys.hasNext()) {
    Integer key = keys.next();
    System.out.println(String.format("키 : %s, 값 : %s", key, tm.get(key)));
}
 
// replace() 메소드를 이용한 요소의 수정
tm.replace(20, "twenty");
 
for (Integer key : tm.keySet()) {
    System.out.println(String.format("키 : %s, 값 : %s", key, tm.get(key)));
}
 
// size() 메소드를 이용한 요소의 총 개수
System.out.println("맵의 크기 : " + tm.size());

>> 맵에 저장된 키들의 집합 : [10, 20, 30, 40]
>> 키 : 10, 값 : 십
>> 키 : 20, 값 : 이십
>> 키 : 30, 값 : 삼십
>> 키 : 40, 값 : 사십
>>  
>> 키 : 10, 값 : 십
>> 키 : 20, 값 : 이십
>> 키 : 30, 값 : 삼십
>>  
>> 키 : 10, 값 : 십
>> 키 : 20, 값 : twenty
>> 키 : 30, 값 : 삼십
>> 맵의 크기 : 3

TreeMap<K, V> 메소드

  • Map.Entry 인터페이스는 Map 인터페이스의 내부 인터페이스로 맵에 저장되는 엔트리의 조작을 위한 메소드가 정의되어 있다.

 

Reference

반응형