지난 포스팅에는 세트에 대해 알아봤다.
그런데 HashSet을 들여다보니 내부에 HashMap이라는 것을 사용하고 있었다.
HashMap이 뭐길래 내부에서 사용되는걸까?

Map은 Key와 Value로 구성된 Entry 모음의 자료 구조이다.
순서를 보장하지 않으며, Key는 중복이 불가능하고, Value는 중복이 가능하다.
가만보니 이거 무언가 익숙한 냄새가 난다.
그렇다.
Value를 제외하면 Set과 동일한 구조이다.

Set 자료 구조에서 Value가 추가된 것이 바로 HashMap이다.
HashMap에서 Key는 Set의 구조를 가진다.
구조가 유사하기 때문에 HashSet에서 HashMap의 기능을 가져다 사용한 것이다.
배열리스트, 연결리스트와 달리 값의 유일성을 보장하며 순서가 필요하지 않은 상황에
Value 요소까지 필요하다면 HashMap을 사용하면 된다.
실무에서 Map 구조가 필요한 경우 주로 HashMap을 사용한다고 한다.
HashMap<String, Integer> profiles = new HashMap<>();
profiles.put("홍길동", 20);
profiles.put("홍길순", 21);
Set<String> names = profiles.keySet(); // ** key는 Set 자료 구조 **
keySet() 메서드로 key 모음을 반환받을 수 있고 반환 타입은 Set이다.
profiles.put("홍길동", 20);
profiles.put("홍길동", 21); // ** 중복이 불가하지만 동작, 값만 변경 **
참고로 key 값이 이미 존재하는데 값을 추가하는 경우, 값만 변경된다.
Collections<Integer> ages = profiles.values() // ** value 모음은 Collection 타입 **
value의 모음은 중복이 가능하지만 순서가 없다.
리스트의 특징도 아니고, Set의 특징도 아니다.
애매한 자료 구조인 value의 모음은 상위 타입인 Collection 반환 타입을 가진다.

HashMap은 배열에 Key와 Value로 구성된 Entry가 구성되어 있다.
LinkedHashMap은 배열이 노드로 구성되어 있으며,
노드 내부에는 Key와 Value를 포함한 Entry와 노드를 이어주는 참조값을 가지는 before, after가 존재한다.
O(log n)의 성능을 가지는 정렬 기능이 포함된 Map.
HashSet 구조에 Value가 필요하다면 Hashmap, 거기에 순서를 보장하고 싶다면 LinkedHashMap, 정렬 기능이 필요하다면 TreeMap을 사용하자.

배열리스트와 연결리스트에 이어서 HashSet을 알아봤었다.
HashSet에는 내부에 HashMap을 사용했는데, 그 정체를 알아냈다.
앞으로 배열리스트와 연결리스트, HashMap을 적절한 상황에 이용해보자.