-
[okky 질문글 답변] map에 대하여개발/Java 2021. 4. 5. 18:23
okky.kr/article/903802?note=2290174
질문 제목
Map과 Hashmap의 차이는 어떤 알고리즘을 쓰느냐의 차이인가요?
본문
Map은 이진탐색트리, Hashmap은 해쉬테이블을 쓴다고 하는데,
어떤경우에 Map을쓰고 또 어떤경우에 Hashmap을 쓰는지 모르겠습니다..
그리고 이런식으로 정의하는건 어떤의미인지 잘 파악이 안됩니다..ㅠ
private static Map<Long, Member> store = new HashMap<>();
나의 답변
1.
Map이란 key-value로 값을 저장하는 자료구조를 의미하구요, 자바에서는 Map의 행동을 정의해놓은 인터페이스입니다.
Map 인터페이스를 구현한 구현체로 HashTable, HashMap, TreeMap, LinkedHashMap, Properties 등이 있는데요
즉 질문하신 Map과 HashMap은 직접 비교대상이 아닙니다. Map의 한 종류로 HashTable, HashMap 등이 있는거죠.
말씀하신 이진 트리를 기반으로 한 Map은 TreeMap 입니다. 이진 트리를 기반으로 저장했다는건 탐색에 용이하겠죠. (값이 n 이상인 객체를 탐색하기 등)
HashTable과 HashMap은 키 객체의 해시값을 버킷이라는 곳에 저장하고 있고 그 값을 통해 객체를 뽑아와서 O(1)의 속도로 객체를 찾아올 수 있는게 장점입니다.
그렇다면 HashTable과 HashMap의 차이는 무엇이냐? (아래 설명에서 버전은 확실하지가 않습니다;;)
HashTable은 자바 1.0부터 존재하던 구현체로 thread-safe 하고 null 값을 허용하지 않습니다.
HashMap은 자바 1.2에 생겨난 구현체로 thread-safe하지 않고 null을 허용합니다. (HashMap을 thread-safe하게 사용하고 싶다면 Collections 클래스에 synchronizedMap() 메서드를 사용하시면 됩니다)
--
2. private static Map<Long, Member> store = new HashMap<>(); 의 의미
Map<Long, Member> store : Map 인터페이스를 구현한 모든 객체를 담을 수 있다는 의미
= new HashMap<>(); : Map의 구현체인 HashMap을 생성해서 할당하겠다는 의미
물론 HashMap<Long, Member> store = new HashMap<>(); 으로 선언하셔도 동작하는데 전혀 문제가 없습니다.
이 부분은 자바의 다형성과 관련이 있다고 보시면 됩니다.
--
1번 문제에 관해선 아무 자바 기본서에서 Collection 관련된 부분을 학습하시면 좋고
2번 문제에 관해선 역시 자바 기본서에서 Collection + 인터페이스 관련된 부분을 학습하시고, 객체지향과 관련된 서적을 찾아보시면 이해하는데 큰 도움이 되실것 같습니다.
객체지향 서적 : 객체지향의 사실과 오해, 오브젝트 (조영호) 강추합니다!