[JAVA] 컬렉션 프레임워크 3 - Map
안녕하세요. 이번 글은 자바 컬렉션 프레임워크 종류 중 하나인 Map에 대한 설명입니다.
- Map<K, V>이란?
Map<K, V>이란 Key와 Value을 기반으로 사용하는 컬렉션을 의미한다. 여기서 Key값은 유일성을 지니는 요소이며 그만큼 중복성이 허용되지 않는다는 점이 특징이다. Value 값은 중복가능하다. 이 둘은 한 쌍으로 반드시 모두 존재해야 되며 절대 분리되는 개념으로 생각하면 안된다.
- Map<K, V>와 관련된 핵심 메서드
메서드 | 설명 |
.put(K key, V value) | Key와 Value 값을 객체에 추가 |
.putAll(Map<E> m) | 다른 객체의 데이터를 자기 자신의 객체에 복사 |
.replace(K key, V value) | Key에 해당되는 값을 Value값으로 변경 |
.replace(K key, V oldValue, V newValue) | Key에 해당되는 값 중 oldValue -> newValue로 변경 |
.get(Object Key) | Key값에 해당되는 Value 값 반환 |
.containsKey(Object Key) | 객체 내 Key값이 있는지에 대한 여부 반환 |
.containsValue(Object value) | 객체 내 Value값이 있는지에 대한 여부 반환 |
.keySet(), .entrySet() | 객체에서 Key 또는 Entry들을 활용해서 객체로 반환 |
.size() | 객체 내 데이터의 갯수 반환 |
.clear() | 객체 내 모든 데이터 삭제 |
.remove(Object Key), .remove(Object key, Object value) | Key값 또는 Key와 Value값에 해당되는 객체 내 데이터 삭제 |
상단의 표는 Map<K, V>와 관련된 전반적인 메서드이다. 대표적으로 HashMap을 활용해 실습 및 설명할 것이다.
- .put()
package classes;
import java.util.HashMap;
import java.util.Map;
public class CFrame_Map {
public static void main (String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "One");
map.put(2, "One");
map.put(3, "One");
map.put(4, "One");
map.put(5, "One");
System.out.println(map.toString()); // {1=One, 2=One, 3=One, 4=One, 5=One}
map.put(6, "Two");
map.put(7, "Three");
map.put(8, "Four");
map.put(9, "Five");
System.out.println(map.toString()); // {1=One, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}
map.put(5, "One"); // KEY 값의 중복으로 인한 추가 불가능
System.out.println(map.toString()); // {1=One, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}
}
}
다음 소스코드를 통해 .put()을 통해 객체 안에 데이터를 추가할 수 있음을 확인할 수 있다. 또한 Value값과 다르게 Key값은 중복될 수 없다는 점 또한 확인할 수 있다.
- .replace()
package classes;
import java.util.HashMap;
import java.util.Map;
public class CFrame_Map {
public static void main (String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "One");
map.put(2, "One");
map.put(3, "One");
map.put(4, "One");
map.put(5, "One");
map.put(6, "Two");
map.put(7, "Three");
map.put(8, "Four");
map.put(9, "Five");
map.replace(1, "Seven");
System.out.println(map.toString()); // {1=Seven, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}
map.replace(3, "Ten");
System.out.println(map.toString()); // {1=Seven, 2=One, 3=Ten, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}
}
}
상단의 소스코드를 통해 .replace()를 통해 Value 값을 변경할 수 있음을 확인가능하다. 이때 Key값을 기반으로 데이터를 찾을 수 있다는 점과 동시에 Map에서 List 인터페이스에서 인덱스와 같은 역할을 하기 때문에 Key값이 중복되면 안되는 이유 또한 확인할 수 있다.
- .get(), .containsKey(), .containsValue(), .keySet(), entrySet()
package classes;
import java.util.HashMap;
import java.util.Map;
public class CFrame_Map {
public static void main (String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "One");
map.put(2, "One");
map.put(3, "One");
map.put(4, "One");
map.put(5, "One");
map.put(6, "Two");
map.put(7, "Three");
map.put(8, "Four");
map.put(9, "Five");
System.out.println(map.get(7)); // true
System.out.println(map.get(12)); // false
System.out.println(map.containsKey(3)); // true
System.out.println(map.containsKey(15)); // false
System.out.println(map.containsValue("Four")); // true
System.out.println(map.containsValue("Eleven")); // false
System.out.println(map.keySet()); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
System.out.println(map.entrySet()); // [1=One, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five]
}
}
상단의 소스코드를 통해 .get()을 통해 Key값이 실제로 객체 안에 존재하는지에 대한 여부를 boolean형으로 반환받을 수 있음을 확인할 수 있다. 또한 .containsKey()와 .containsValue()를 통해 각각 Key와 Value값을 기반으로 객체 안에 존재하는지에 대한 여부를 boolean을 통해 true, false 둘 중 하나로 확인해볼 수 있다. 마지막으로 keySet()으로 객체 내에서 Key값만 모아서 조회할 수 있으며 entrySet()을 통해 각각의 엔트리들을 모아서 볼 수 있음을 확인할 수 있다.
- .remove(), .clear(), .size()
package classes;
import java.util.HashMap;
import java.util.Map;
public class CFrame_Map {
public static void main (String[] args) {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "One");
map.put(2, "One");
map.put(3, "One");
map.put(4, "One");
map.put(5, "One");
map.put(6, "Two");
map.put(7, "Three");
map.put(8, "Four");
map.put(9, "Five");
System.out.println(map.size()); // 9
System.out.println(map.toString()); // {1=One, 2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}
map.remove(1);
System.out.println(map.size()); // 8
System.out.println(map.toString()); // {2=One, 3=One, 4=One, 5=One, 6=Two, 7=Three, 8=Four, 9=Five}
map.clear();
System.out.println(map.size()); // 0
System.out.println(map.toString()); // {}
}
}
상단의 소스코드를 통해 .remove()를 통해 객체 내 데이터를 key값을 기반으로 삭제 가능하다는 점을 확인할 수 있다. 또한 삭제가 제대로 됐음을 .size()와 .toString()을 통해서 검증할 수 있음을 확인 가능하다. 그리고 .clear()를 통해 객체 내 모든 데이터를 Key와 Value값 모두 전체 삭제했음을 앞에 언급한 두 개의 메서드를 통해 확인 및 검증할 수 있다.
- HashMap 말고도 다른 Map은 존재한다. LinkedHashMap<K, V>
LinkedHashMap<K, V>는 기존 HashMap<K, V>를 기반으로 제작된 클래스이며 기본적인 특성에 입력한 데이터의 순서에 대한 정보가 추가된 클래스다. 앞뒤로 Key의 정보가 서로 연결되어 있으며 사용하는 메서드는 HashMap<K, V>와 전체적으로 모두 일치하다. 여담으로 TreeMap<K, V>가 있는데 이는 트리구조를 기반으로 상하관계를 바탕으로 되어있으며 데이터를 Key 값의 크기 순으로 정렬하면서 관리한다는 점이 특징이다. 관련 메서드도 Key 값의 크기를 비교 및 대조하는 방식으로 되어있다.
다음 글은 제너릭에 대한 설명입니다. 감사합니다.