이번 포스팅에서는 Map인터페이스를 구현하는 컬렉션 클래스들에 대해 설명하고자 한다. 이 클래스들의 데이터 저장방식을 가리켜 key-value 방식이라 한다.
즉, key를 저장하고 그 key에 대응하는 value값도 같이 저장한다는 것이다.
그래서 데이터 1개는 key와 이에 딸려있는 value값이 각각 한개씩 있다는 것이다.
이러한 데이터 저장방식을 갖는 Map인터페이스를 구현하는 클래스는 HashMap, TreeMap, LinkedHashMap 세 가지가 있다.
먼저 HashMap을 살펴보겠다.
HashMap
import java.util.HashMap;
public class MapClass {
public static void main(String[] args) {
HashMap<Integer, String> hMap = new HashMap<Integer, String>();
hMap.put(1, "홍길동");
hMap.put(2, "세종대왕");
hMap.put(3, "이순신");
hMap.put(1, "유관순");
hMap.put(4, "세종대왕");
System.out.println(hMap);
}
}
{1=유관순, 2=세종대왕, 3=이순신, 4=세종대왕}
HashMap을 간단하게 사용해 보았다. hMap이라는 HashMap 객체를 만들어 데이터를 저장하고 있다. 데이터 입력값은 5개인데 출력값을 보니 4개뿐이다. 이는 key값의 중복은 허용하지 않기 때문이다. 예를들어 학창시절 다들 자신만의 학번을 가졌을 것이다. 같은학번을 둘이서 가지는게 가능한가? 그런일은 절대 일어나지 않는다. 여기서 학번은 key값이 되는 것이다. 하지만 이름이 똑같은 학생은 종종 있기 마련이다. 이름이 같다고 해서 둘이 같은사람인가? 아니다. 여기서 이름은 value값이 된다. 그 이름이 같은 학생을 구분하려면 key값인 학번을 확인하면 된다. 3학년1반에 번호가 1번인 학생은 단 한명이듯 자바에서도 하나의 객체에서 1번이라는 key는 단 하나여야 한다는 것이다.
이제 이해가 되었는가? 그렇다면 위의 소스를 이해할 수 있을 것이다. 이해만 하면 그리 어려운 내용은 아니니 바로 다음으로 넘어가겠다.
TreeMap
package CollectioinPractice;
import java.util.TreeMap;
public class MapClass {
public static void main(String[] args) {
TreeMap<Integer, String> tMap = new TreeMap<Integer, String>();
tMap.put(4, "세종대왕");
tMap.put(1, "유관순");
tMap.put(3, "이순신");
tMap.put(1, "홍길동");
tMap.put(2, "세종대왕");
System.out.println(tMap);
}
}
{1=홍길동, 2=세종대왕, 3=이순신, 4=세종대왕}
TreeMap의 특징은 key값을 기준으로 데이터를 정렬한 상태로 저장한다는 것이다.
소스를 보면 입력을 무작위로 넣은 것을 볼 수 있을 것이다. 하지만 출력값은 key값을 기준으로 정렬이 되어있다.
이것이 HashMap과 TreeMap의 차이이다.
LinkedHashMap
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
public class MapClass {
public static void main(String[] args) {
LinkedHashMap<Integer, String> lMap = new LinkedHashMap<Integer, String>();
lMap.put(4, "세종대왕");
lMap.put(1, "유관순");
lMap.put(3, "이순신");
lMap.put(1, "홍길동");
lMap.put(2, "세종대왕");
System.out.println(lMap);
Iterator<Integer> ir = lMap.keySet().iterator();
while(ir.hasNext()) {
System.out.println(ir.next());
}
}
}
{4=세종대왕, 1=홍길동, 3=이순신, 2=세종대왕}
4
1
3
2
이번에는 LinkedHashMap을 사용한 소스이다. TreeMap에서 입력한 순서 그대로 사용해보았다. 하지만 출력값 순서는 입력한 순서 그대로 나오는 것을 알 수 있다. 이와 같이 LinkedHashMap은 입력한 데이터 순서대로 저장되는 특성이 있다.
참고로 소스에 Iterator라는 순환자를 사용한 것을 볼 수 있을 것이다. 이것은 List와 Set을 구현하는 클래스이다. 주로 읽기 전용으로 사용하고 위 소스와 같이 값하나하나 읽어들이는 것으로 사용할 수 있다. Iterator는 Map을 구현하지 않기때문에 ketSet() 이라는 메소드를 통해 key값을 set(집합)으로 만들어주고 iterator메소드로 순회하는 방법으로 LinkedHashMap의 Key값들을 순회하며 하나씩 읽어들이고 있는 것이다.
마지막으로 정리하자면
Map인터페이스는 Collection인터페이스를 구현하며 Map 인터페이스를 구현하는 Map의 종류에는 HashMap, TreeMap, LinkedHashMap 클래스가 존재한다. Map은 기본적으로 key와 value값을 가진다.
▶HashMap은 입력한 순서에 상관없이 데이터가 저장된다.
▶TreeMap은 입력한 순서에 상관없이 key를 기준으로 정렬이 되어 저장된다.
▶LinkedTreeMap은 입력한 순서대로 데이터가 저장된다.