Java

[Java] Map, Hashmap의 차이

뚜코맨 2023. 12. 29. 15:14

 

김영한 선생님의 스프링 강의를 듣던 중

 

 

이렇듯 Map<Long,Member> store = new HashMap<>(); 선언부가 있었다

내가 알고 있던 선언방법과는 달라서 어떤 의미로 이렇게 구현한지 의문이 들었다

 

내가 생각했던 구현 방법은

Map 사용시 : Map<Long, Member> store =  new Map<>()
HashMap 사용시: HashMap<Long, Member> store = new HashMap<>()

 

이렇게 구현할 거라 생각했는데, 김영한 선생님의 구현은 이렇게 하지 않았다. 이유를 찾기전에 일단 Map과 HashMap의 정확한 차이점을 알아보았다.

1. Map

Map은 Key 와 Value 를 가진 집합이며, 중복을 허용하지 않는다.
즉, 한개의 Key에 한개의 Value 가 매칭된다.

Java.util 패키지에 여러 집합들을 사용하기 위한 여러 Interface 와 class 들이 정의되어 있다.
Map은 키(Key)와 값(Value)으로 이루어진 데이터의 집합이다. 

순서는 유지되지 않으며, 키는 중복을 허락하지 않는다. 

Map의 클래스로는 TreeMap, HashTable, HashMap 등이 있다.

2. HashMap

HashMap 은 Map Interface 를 Implements 한 클래스로서 중복을 허용하지 않는다.
Map의 특징인 Key 와 Value 의 쌍으로 이루어지며, key 또는 value 값으로써 null 을 허용한다.

💡HashMap은 Map이라는 interface의 구현체(implemetents) 였던것이다.

 

그래서 왜? Map을 HashMap으로 구현하였는가?

 HashMap을 Map으로 선언하는 이유

1. Map은 인터페이스이기 때문이다.

  1. Map은 인터페이스이기 때문에 선언만 가능하며 객체 생성(new)이 불가능하다.
  2. HashMap은 Map을 구현한 구현체이기 때문에 HashMap을 Map형태로 선언할 수 있다.

2. 유연성을 높이기 위함이다.

  1. Map을 구현한 클래스는 HashMap, TreeMap 등이 있다.
  2. Map 형태로 선언한 경우 언제든 다른 구현체로 변경할 수 있다. 객체지향스럽게, 변경에 용이하게 하는 것이다.

💥 다만, Map형태로 선언한 경우, Map 인터페이스가 가진 메서드만 사용할 수 있기 때문에 하위 클래스의 자체 메서드를 사용하려면

다운캐스팅이 필요하다.
ex) ((HashMap)map).clone(); -> HashMap이 가진 clone 메서드를 사용하는 경우

 

알아보던중 나와 같은 궁금증을 가진 사람이 질문하여 김영한 선생님의 답변을 받게되었다.

 

라는 말씀을 해주셨다. 아직 나는 많이 부족한것같다.

객체지향의 꽃은 다형성에 있다 라는 말이 많이 와닿았다.