정말 부끄럽게도, 개발자로 취업했지만 맵에 대해서 잘 모르고 코딩하고 있었다. 어떻게 코딩했는지는 모르겠지만, 맵을 쓸때 같이 쓰는걸 통째로 외우고 개념은 잘 모르고 있었다.
얼마 전 회사 코드에서 hashtable 을 발견했는데, 사수분이 hashtable 이 맵의 일환이라 했다. 그럼 map, hashmap, hashtable 의 차이는 뭘까…?
맵
우선 맵의 개념을 정의하자면, 맵(Map)은 대응 관계를 쉽게 표현할 수 있게 해주는 자료형이다. Associative array (연관배열) 혹은 hash라고 부른다.
맵은 키(key)와 그에 대응하는 값 (value)를 한쌍으로 가지는 자료형이다. 즉, 사전처럼 영어단어 - 그에 해당하는 한국어 뜻 처럼 찾는다고 볼 수 있다.
맵은 키를 통해 값을 검색하고, 키와 값의 쌍을 저장하고 관리하는 역할을 한다. 때문에, 중복된 키를 허용하지 않으며 각 키는 유일해야 한다.
Put
Key 와 Value 를 설정할 수 있다.
map.put(“people”, “김작성자“);
map.put(“dept”, “IT 부서”);
Get
Key 에 해당하는 value 값을 가져온다.
map.get(“people”); //김작성자 값을 가져옴
만약 key 에 해당하는 value 가 없을 때는 null 값을 돌려준다.
containsKey
맵에 해당 key가 있는지 참/ 거짓으로 결과를 돌려준다.
map.containsKey(“people”); // true
map.containsKey(“address”); // false
Remove
맵의 항목을 삭제한다. key의 항목을 삭제 후 value 값을 리턴한다.
map.remove(“people”); // 김작성자 리턴 후 key 삭제됨
Size
Size 메서드는 맵 요소의 개수를 리턴한다. 해당 맵에 Key 가 몇 개 있는지 리턴한다.
map.size(); // people 이 삭제되었으니 1 반환
keySet
맵의 모든 key를 모아서 리턴란다. 이때 집합 자료형으로 리턴하는데, 집합 자료형은 리스트 자료형으로 바꾸어 사용할 수도 있다.
ArrayList<String> keyList = new ArrayList<>(map.keySet());
Map 과 List의 차이
Map은 List와 달리 순서에 의존하지 않고 키값과 value 값을 가져온다.
만약 Map 에서 입력된 순서대로 데이터를 가져오거나 입력한 key에 의해 정렬하도록 저장하고 싶을 땐 LinkedHashMap과 TreeMap을 사용한다.
- LinkedHashMap : 입력된 순서대로 데이터를 저장한다.
- TreeMap : 입력된 key의 오름차순으로 데이터를 저장한다.
Hashmap, Hashtable 의 차이는?
이제 map 의 개념도 정립했으니, 가장 근본적으로 궁금했던 hashmap, hashtable의 차이에 대해 알아보았다.
hashmap, hashtable 둘다 키-값 쌍을 저장하는 자료구조이다. 하지만 둘의 차이점으로는
- 동기화 : hashtable은 동기화된 메서드로 구성되어 스레드 안정성을 제공한다. 즉, 여러 스레드기 동시에 hashtable 에 접근하더라도 안전하게 사용할 수 있다. Hashmap은 동기화를 제공하지 않기 때문에 스레드간 동시 접근에 대한 처리를 직접 해주어야 한다.
- null 허용 : hashtable 은 키나 값에 null을 허용하지 않는다. 만약 사용할경우, nullPointerException 에러가 발생한다. 반면 hashmap 은 하나의 null 키와 여러개의 null 값을 허용한다.
- 속도 : 일반적으로 hashmap이 hashtable보다 더 빠르다. Hashmap이 동기화를 제공하지 않기 때문이다. 단일 스레드 환경에서 hashmap 을 사용하는 것이 성능상 이점이 있다.
위와 같은 차이들이 있다. Hashmap 과 hashtable 을 선택할때는 사용 목적을 생각하고 전체적인 구조 흐름을 생각해야한다는 것 같다. 프로그래밍 구조와 운영체제에 대해 공부해야 한다고 느꼈다.
출처
https://ko.wikipedia.org/wiki/연관_배열