Map interface and its implementations
Map은 실제로 많이 사용되는 객체이지요. 이번에는 Map에 대해 써 볼까 합니다. Set을 자세히 알기 위해서도 먼저 Map을 알아두는 것이 좋다고 생각이됩니다. 왜냐면 Set의 구현체들 HashSet, TreeSet등등은 내부적으로 Map의 구현체들을 각각 사용하여 요소들을 저장 및 추출하고, 정렬하기때문입니다.
Map의 특성
Key, Value의 Entry 구조
Map의 요소는 key, value형태의 구조를 가지며, Entry라는 타입으로 Map에 저장됩니다. 고유한 key와 1:1로 매핑되는 value를 가지는 것이죠.
Elements and auto-boxing
key, value 모두 primitive, Object 타입을 받을 수 있는 것 처럼 보이지만 실제론 그렇지 않습니다. primitive type의 변수를 key 혹은 value로 입력할 경우 내부적으로 입력한 primitive type과 매핑되는 Wrapper Object 타입으로 auto-boxing이 이루어 집니다. 그 이유는 Map의 put, get, containsKey, containsValue등의 메서드를 보면 알 수 있지 않나 생각됩니다. 각각의 메서드는 인자로 Object 타입을 받습니다.
아래의 예제를 보면 알 수 있습니다. key, value로 int 형의 1,2를 각각 입력했습니다.
하지만 get 메서드에 의해 반환된 value의 타입을 보면 int의 Wrapper인 Integer입니다. 즉, 내부적으로 auto-boxing이 일어난겁니다.
별거 아닌거 같지만 auto-boxing, un-boxing은 속도에 영향을 미칩니다. 되도록이면 key, value입력시에 primitive type은 해당 Wrapper로 변환하여 입력하는 것이 좋을 것으로 생각됩니다.
auto-boxing sample code
public class MapAutoboxingTestDrive{
Map<Integer, Integer> autoboxingMap = new HashMap<Integer,Integer>();
autoboxingMap.put(1, 1);
autoboxingMap.put(2, 2);
if(autoboxingMap.containsKey(1)){
System.out.println("autoboxing occur for 1");
System.out.println("return type of value returned by get" + autoboxingMap.get(1).getClass().getName());
}
}
auto-boxing sample output
autoboxing occur for 1
return type of value returned by getjava.lang.Integer
