"해시맵"의 두 판 사이의 차이
잔글 |
39.7.24.82 (토론) (태그: 모바일 편집, 모바일 웹 편집) |
||
(사용자 4명의 중간 판 14개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | '''해시맵'''<!--해시 맵-->( | + | '''해시맵'''<!--해시 맵-->(hashmap)은 컴퓨팅에서 [[키]]를 [[값]]에 [[매핑]]할 수 있는 구조인, 연관 배열 추가에 사용되는 [[자료구조]]이다. |
== 개요 == | == 개요 == | ||
− | 해시맵은 저장은 느리지만 다량의 데이터를 검색하는데 뛰어난 성능을 가진 맵 [[인터페이스]] 계열의 대표적인 클래스로서 '''키'''(key)와 ''' | + | |
+ | 해시맵은 저장은 느리지만 다량의 데이터를 검색하는데 뛰어난 성능을 가진 맵 [[인터페이스]] 계열의 대표적인 클래스로서 '''키'''(key)와 '''값'''(value)의 쌍으로 이루어진다. 해시맵은 주요 메소드에 동기화(synchronized) 키워드가 없고 [[해시]] 알고리즘을 사용한다.<ref>JayB Kim, 〈[https://jaybdev.net/2017/06/10/Algorithm-7/ HashMap 과 Hashtable 의 차이]〉, 《개인 블로그》, 2017-06-10</ref> | ||
== 특징 == | == 특징 == | ||
− | 해시맵은 맵 인터페이스를 기반으로 구현되며 맵의 수행을 모두 지원하며, 키와 밸류에 널(null)을 허용한다. 해시맵은 맵의 순서를 보장하지 않고 해시 함수가 복수의 버킷으로 요소를 적절히 분산 시키는 것을 상정해, 기본 | + | |
+ | 해시맵은 맵 인터페이스를 기반으로 구현되며 맵의 수행을 모두 지원하며, 키와 밸류에 널(null)을 허용한다. 해시맵은 맵의 순서를 보장하지 않고 해시 함수가 복수의 버킷으로 요소를 적절히 분산 시키는 것을 상정해, 기본 수행(Get, Set)에 일정시간의 퍼포먼스를 제공한다. 해시맵의 인스턴스에는 성능에 영향을 주는 2개의 파라미터 초기용량, 부하계수가 존재한다. '''초기 용량'''은 버킷의 개수이며 '''부하계수'''는 버킷에 들어가는 엔트리(entry)개수와 버킷의 총수의 비율이다. 부하계수가 커질수록 메모리가 절약되지만 검색이 어렵다는 단점이 있다. 이와 더불어 해시맵은 동기화되지 않는다.<ref>Vaert Street, 〈[https://vaert.tistory.com/97 (Java) 해시맵(HashMap)에 대하여 심층적으로 알아보자]〉, 《티스토리》, 2014-03-21</ref> | ||
+ | |||
+ | === 인터페이스 === | ||
+ | |||
+ | * '''맵인터페이스''': 맵(Map)인터페이스는 키(Key)와 값(value)를 하나의 세트로 묶어 저장하는 컬렉션 클래스를 구현하는데 사용한다. 값은 중복될 수 있지만 키는 중복될 수 없다. 데이터와 중복된 키와 값을 저장하면, 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다. | ||
+ | * '''맵.엔트리인터페이스''': 맵.엔트리(Map.Entry)인터페이스는 맵인터페이스의 내부 인터페이스이다. 맵에 저장되는 키와 값을 다루기 위한 인터페이스이며 맵인터페이스를 구현하는 클래스는 맵.엔트리인터페이스도 함께 구현해야 한다.<ref>게임회사에서 살아남기, 〈[https://whatisthenext.tistory.com/81 (jAVA) 해시맵(HashMap)]〉, 《티스토리》, 2016-08-31</ref> | ||
+ | |||
+ | === 해시맵과 해시테이블=== | ||
+ | |||
+ | 해시맵과 해시테이블은 맵인터페이스를 상속받아 구현되어 데이터를 키와 값으로 관리하는 자료구조이다. 두 가지 모두 키가 데이터를 추출할 때 구분자로 활용하는 방식을 취하여 리스트 인터페이스와 같은 자료구조보다 탐색에 있어 더 효율적이다.<ref name="Odol87">Odol87 , 〈[https://odol87.tistory.com/3 (JAVA) HashMap과 HashTable 차이]〉, 《티스토리》, 2016-02-23</ref> | ||
+ | |||
+ | ==== 동기화 ==== | ||
+ | |||
+ | 해시맵은 동기화(Synchronization)를 지원하지 않는다. 해시테이블의 경우 동기화를 지원하여 실행 환경에 따라 구분하여 사용할 수 있다. 하지만 해시테이블의 이러한 특징은 속도적인 측면에서 동기화 처리라는 비용이 발생하여 해시맵보다 더 느린 속도를 보여준다.<ref name="Odol87"></ref> | ||
+ | |||
+ | === 반환값 === | ||
+ | |||
+ | 해시맵은 저장된 요소들의 순회를 위해 '''Fail-Fast Iterator'''를 반환한다. 반면 해시테이블은 같은 상황에서 '''Enumeration'''을 반환한다. Enumeration과 Iterator는 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다. Enumeration은 컬렉션 프레임워크 이전에 사용되던 인터페이스로 Iterator의 사용을 권장한다. 그리고 다른 스레드에서 해당 자료에 요소를 삽입, 삭제, 수정하면 '''ConcurrentModificationException'''을 발생시켜 일관성을 보장한다. 이를 Fail-Fast Iterator라 한다.<ref name="Odol87"></ref> | ||
+ | |||
+ | == 주요 메소드 == | ||
+ | |||
+ | :{|class=wikitable width=500 | ||
+ | !align=center|해시맵 메소드 | ||
+ | !align=center|설명 | ||
+ | |- | ||
+ | |align=center|put() | ||
+ | |align=left|- 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. | ||
+ | |- | ||
+ | |align=center|get() | ||
+ | |align=left|- 지정한 키(Key)에 해당하는 데이터를 반환한다. | ||
+ | |- | ||
+ | |align=center|remove() | ||
+ | |align=left|- 지정한 키(Key)에 해당하는 데이터를 삭제한다. | ||
+ | |- | ||
+ | |align=center|containKey() | ||
+ | |align=left|- 지정한 키(Key)가 존재하는지 여부를 반환한다. | ||
+ | |- | ||
+ | |align=center|containsValue() | ||
+ | |align=left|- 지정한 값이 존재하는지 여부를 반환한다. | ||
+ | |- | ||
+ | |align=center|size() | ||
+ | |align=left|- 맵의 요소 개수를 반환한다. | ||
+ | |- | ||
+ | |align=center|isEmpty() | ||
+ | |align=left|- 맵이 비어 있는지의 여부를 반환한다. | ||
+ | |} | ||
{{각주}} | {{각주}} | ||
== 참고자료 == | == 참고자료 == | ||
− | + | ||
* 게임회사에서 살아남기, 〈[https://whatisthenext.tistory.com/81 (jAVA) 해시맵(HashMap)]〉, 《티스토리》, 2016-08-31 | * 게임회사에서 살아남기, 〈[https://whatisthenext.tistory.com/81 (jAVA) 해시맵(HashMap)]〉, 《티스토리》, 2016-08-31 | ||
* JayB Kim, 〈[https://jaybdev.net/2017/06/10/Algorithm-7/ HashMap 과 Hashtable 의 차이]〉, 《개인 블로그》, 2017-06-10 | * JayB Kim, 〈[https://jaybdev.net/2017/06/10/Algorithm-7/ HashMap 과 Hashtable 의 차이]〉, 《개인 블로그》, 2017-06-10 | ||
* Vaert Street, 〈[https://vaert.tistory.com/97 (Java) 해쉬맵(HashMap)에 대하여 심층적으로 알아보자]〉, 《티스토리》, 2014-03-21 | * Vaert Street, 〈[https://vaert.tistory.com/97 (Java) 해쉬맵(HashMap)에 대하여 심층적으로 알아보자]〉, 《티스토리》, 2014-03-21 | ||
+ | * Odol87 , 〈[https://odol87.tistory.com/3 (JAVA) HashMap과 HashTable 차이]〉, 《티스토리》, 2016-02-23 | ||
== 같이 보기 == | == 같이 보기 == | ||
19번째 줄: | 67번째 줄: | ||
* [[해시테이블]] | * [[해시테이블]] | ||
− | {{블록체인 기술| | + | {{블록체인 기술|검토 필요}} |
+ | {{데이터}} |
2021년 10월 31일 (일) 13:52 기준 최신판
해시맵(hashmap)은 컴퓨팅에서 키를 값에 매핑할 수 있는 구조인, 연관 배열 추가에 사용되는 자료구조이다.
개요[편집]
해시맵은 저장은 느리지만 다량의 데이터를 검색하는데 뛰어난 성능을 가진 맵 인터페이스 계열의 대표적인 클래스로서 키(key)와 값(value)의 쌍으로 이루어진다. 해시맵은 주요 메소드에 동기화(synchronized) 키워드가 없고 해시 알고리즘을 사용한다.[1]
특징[편집]
해시맵은 맵 인터페이스를 기반으로 구현되며 맵의 수행을 모두 지원하며, 키와 밸류에 널(null)을 허용한다. 해시맵은 맵의 순서를 보장하지 않고 해시 함수가 복수의 버킷으로 요소를 적절히 분산 시키는 것을 상정해, 기본 수행(Get, Set)에 일정시간의 퍼포먼스를 제공한다. 해시맵의 인스턴스에는 성능에 영향을 주는 2개의 파라미터 초기용량, 부하계수가 존재한다. 초기 용량은 버킷의 개수이며 부하계수는 버킷에 들어가는 엔트리(entry)개수와 버킷의 총수의 비율이다. 부하계수가 커질수록 메모리가 절약되지만 검색이 어렵다는 단점이 있다. 이와 더불어 해시맵은 동기화되지 않는다.[2]
인터페이스[편집]
- 맵인터페이스: 맵(Map)인터페이스는 키(Key)와 값(value)를 하나의 세트로 묶어 저장하는 컬렉션 클래스를 구현하는데 사용한다. 값은 중복될 수 있지만 키는 중복될 수 없다. 데이터와 중복된 키와 값을 저장하면, 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.
- 맵.엔트리인터페이스: 맵.엔트리(Map.Entry)인터페이스는 맵인터페이스의 내부 인터페이스이다. 맵에 저장되는 키와 값을 다루기 위한 인터페이스이며 맵인터페이스를 구현하는 클래스는 맵.엔트리인터페이스도 함께 구현해야 한다.[3]
해시맵과 해시테이블[편집]
해시맵과 해시테이블은 맵인터페이스를 상속받아 구현되어 데이터를 키와 값으로 관리하는 자료구조이다. 두 가지 모두 키가 데이터를 추출할 때 구분자로 활용하는 방식을 취하여 리스트 인터페이스와 같은 자료구조보다 탐색에 있어 더 효율적이다.[4]
동기화[편집]
해시맵은 동기화(Synchronization)를 지원하지 않는다. 해시테이블의 경우 동기화를 지원하여 실행 환경에 따라 구분하여 사용할 수 있다. 하지만 해시테이블의 이러한 특징은 속도적인 측면에서 동기화 처리라는 비용이 발생하여 해시맵보다 더 느린 속도를 보여준다.[4]
반환값[편집]
해시맵은 저장된 요소들의 순회를 위해 Fail-Fast Iterator를 반환한다. 반면 해시테이블은 같은 상황에서 Enumeration을 반환한다. Enumeration과 Iterator는 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다. Enumeration은 컬렉션 프레임워크 이전에 사용되던 인터페이스로 Iterator의 사용을 권장한다. 그리고 다른 스레드에서 해당 자료에 요소를 삽입, 삭제, 수정하면 ConcurrentModificationException을 발생시켜 일관성을 보장한다. 이를 Fail-Fast Iterator라 한다.[4]
주요 메소드[편집]
해시맵 메소드 설명 put() - 키(Key)와 값으로 구성된 새로운 데이터를 추가한다. get() - 지정한 키(Key)에 해당하는 데이터를 반환한다. remove() - 지정한 키(Key)에 해당하는 데이터를 삭제한다. containKey() - 지정한 키(Key)가 존재하는지 여부를 반환한다. containsValue() - 지정한 값이 존재하는지 여부를 반환한다. size() - 맵의 요소 개수를 반환한다. isEmpty() - 맵이 비어 있는지의 여부를 반환한다.
각주[편집]
- ↑ JayB Kim, 〈HashMap 과 Hashtable 의 차이〉, 《개인 블로그》, 2017-06-10
- ↑ Vaert Street, 〈(Java) 해시맵(HashMap)에 대하여 심층적으로 알아보자〉, 《티스토리》, 2014-03-21
- ↑ 게임회사에서 살아남기, 〈(jAVA) 해시맵(HashMap)〉, 《티스토리》, 2016-08-31
- ↑ 4.0 4.1 4.2 Odol87 , 〈(JAVA) HashMap과 HashTable 차이〉, 《티스토리》, 2016-02-23
참고자료[편집]
- 게임회사에서 살아남기, 〈(jAVA) 해시맵(HashMap)〉, 《티스토리》, 2016-08-31
- JayB Kim, 〈HashMap 과 Hashtable 의 차이〉, 《개인 블로그》, 2017-06-10
- Vaert Street, 〈(Java) 해쉬맵(HashMap)에 대하여 심층적으로 알아보자〉, 《티스토리》, 2014-03-21
- Odol87 , 〈(JAVA) HashMap과 HashTable 차이〉, 《티스토리》, 2016-02-23
같이 보기[편집]
|