코딩조각

[Collection]왜 HashMap선언을 Map<String, Object> map = new Hashmap<String,Object>(); 로 선언할까?

밍튜 2023. 11. 2. 10:57

인수인계 받은 회사 코드를 살펴보던중

의문이 들었던게 있다.

HashMap객체를 생성할떄

Map<String, Object> map = new HashMap<String, Object>();

위와 같은 형식으로 선언되어있었다.

 

객체의 Type과 instance의 Type이 달라서 갑자기 의문이 들었다.

그래서 왜그런지 기본으로 돌아가(?) 한번 찾아보았다. 

 


이유 2가지

 

첫번째. 인터페이스이기 때문에

 

예를들자면 , List는 List list = new List();와 같이 선언할 수 없다.

왜냐하면 List는 Collection에 있는 Interface라서 바디를 직접 작성할 수 없고 그 구현체를 만들어야하기 때문에

직접선언이 불가능하다.

    Map도 같은 이유이다...Map도 Interface이기 때문에 직접선언을 할수가 없다.

그래서 Map 인터페이스의 구현체인 HashMap으로 선언하는것이다.

 

출처: 자바의정석 유튜브

  ① Map은 인터페이스다.

  ② 따라서 Body를 직접 작성할 수 없다.

  ③ HashMap은 Map 인터페이스를 구현했다.

 


아니 그럼 왜 HashMap<String, Object> map = new HashMap<String, Object>();

로 구현하면 안되나??

 

가능하긴 하지만 객체 선언 Type을 Map으로 한 이유가 있다.

 


두번째 코드의 유연성을 높일 수 있으니까

Map인터페이스를 구현한 객체는 HashMap, TreeMap, HashTable등이 있다.

출처 : 자바의정석 유튜브

Map으로 선언할 경우, HashMap으로 선언할 때보다 가짓수가 많아진다.

결국 코드의 유연성을 높일 수 있게 되는 것이다.

이게 무슨말이냐면, Map map = new HashMap<>();으로 선언되어있는 map을 HashMap이아닌 TreeMap으로 변경하기가

쉬워진다는 말이다.

interface인 Map을 타입으로 선언하게되면 그 구현체들로 코드변경이 쉬워진다.

 

 Map map = new TreeMap<>(); 
 =>  Map map = new HashMap<>();

그래서... 저렇게 선언되어있는거구나 하고 원래 알았어야하지만 지금이라도 알게된 java 지식 +1습득