인수인계 받은 회사 코드를 살펴보던중
의문이 들었던게 있다.
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습득
'코딩조각' 카테고리의 다른 글
| [java] java는 항상 변수의 값을 복사해서 대입한다 (1) | 2023.12.07 |
|---|---|
| [Docker] docker Got permission denied while trying to connect to the Docker daemon socket 에러 해결하기 (0) | 2023.11.07 |
| [web] Dynamic IP와 Static IP (0) | 2023.03.14 |
| [DB] 자동커밋, 수동커밋 이란? (0) | 2023.02.09 |
| [spring]DAO, DTO, VO 란? (0) | 2023.01.13 |