🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.
HashMap
Hashtable
과TreeMap
,SortedMap
같이Map
인터페이스를 구현한 대표적인 컬렉션 클래스로
데이터를 " 키와 값의 쌍 (Entry) "으로 저장하는 특징을 가지고 있다.
- " 순서 X " & " 키 : 중복 허용X / 값 : 중복 허용 "
( " 순서를 유지 " ▶LinkedHashMap
을 사용 )- "해싱(hashing)" 을 사용해서 많은 양의 데이터 검색 기능이 뛰어나다.
Hashtable
과HashMap
의 관계는
이전에 살펴봤던 〔Vector
-ArrayList
〕의 관계와 같이
동기화가 되어 있는Hashtable
을 "동기화 없는HashMap
"으로 개선한 것이다.
( 왠만해서 Map을 쓰고 싶을 땐, HashMap을 쓰면 된다. )
TreeMap
은 앞서 알아봤던 TreeSet과 같이 이진 탐색 트리 구조를 가진 Map이다.
( 장점 또한 "범위 검색"과 "정렬"에 유리하고 HashMap보다 데이터 추가/삭제에 시간이 더 소요된다.)
HashMap
은 데이터를 하나의 쌍
즉. " Entry "이라는 내부 클래스로 저장하게 된다.
/* 실제 HashMap 소스 */
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {
transient Entry[] table ;
...
// Map인터페이스의 "static inner interface"인 Entry 정의
static class Entry implements Map.Entry {
final Object key ; // 중복 불가 & value와 연결되어 있는 상수로 key
Object value ;
...
}
}
위에 볼 수 있듯
Entry 클래스를 정의하고
다시 Entry타입 배열을 선언하고 있는 모습인데
이는
《 key와 value 》를
" 각각 저장하기 보다는 서로 관련된 값이니 하나의 배열로 다루게 해서 "
데이터의 무결성 측면에서 안정적으로 사용할 수 있게끔 한다.
* Object 타입으로 저장되기 때문에 어떤 객체라도 상관없지만
"키(Key)"는 주로 String을 대문자/소문자 둘 중 하나로 통일해서 사용한다.
add()
나remove()
,size()
,isEmpty()
,iterator()
,clear()
,clone()
등 등의 메서드들은
앞서 알아봤던 Collection 인터페이스를 구현했던 컬렉션들의 메서드 기능과 동일하게 사용하면 된다.
Method | 설명 |
---|---|
HashMap() | 크기 0인 " HashSet 생성 |
HashMap( int initialCapacity ) | 초기 용량 지정 HashMap 생성 |
HashMap( int initialCapacity, float loadFactor ) | 용량 지정 HashSet 생성 loadfactor : 언제 용량으로 늘릴 것인지 |
HashMap( Map m ) | Map을 HashMap으로 변환 |
Method | 설명 |
---|---|
Object put( Object key, Object value ) | key-value (Entry) 저장 |
void putAll( Map m ) | Map 객체의 데이터 모두 저장 |
Object remove( Object key ) | key값을 가진 Entry 삭제 |
Object replace( Object key, Object value ) | 해당 키의 Entry의 값을 value 로 변경 *해당 키를 가진 객체를 찾을 수 없으면 null |
boolean replace(Object key, Object oldValue, Object newValue ) | 해당 key를 가진 Entry의 oldValue를 newValue로 변경 |
Method | 설명 |
---|---|
[ Entry 요소 - Set객체 변환 ] | |
Set entrySet() | 키-값 쌍(entry) 객체들의 Set 반환 |
Set keySet() | Only 키(key) Set 반환 |
Collection values() | Only 값(value) Set 반환 |
[ Entry 요소 - 값 ] | |
Object get( Object key ) | 입력 키에 해당하는 Entry의 값(value) 반환 |
Object getOrDefault( Object key, Object defaultValue ) | 입력 키에 해당하는 Entry의 값(value) 반환 " 해당 키를 가진 객체가 없을 경우 ", 반환할 기본값 지정 |
Method | 설명 |
---|---|
boolean containsKey( Object key ) | " 키(key) 中 " 해당 키가 있는지 |
boolean containsValue( Object value ) | " 값(value) 中 " 해당 값이 있는지 |
hashing
)리스트와 같은 자료구조와 달리
딕셔너리(Dictionary) 구조 같이 " 키(key)를 통해 값을 저장&분류하는 구조 " 에서 구현된다.
키 값의 연산을 통해 " 직접 접근&저장이 가능한 구조의 저장소 " : 해시 테이블(hash table)
( 배열 & 링크드 리스트가 조합된 형태 _ 분류된 수납장 + 각 칸마다 소속된 데이터들이 연결되어 있음. )
해시 테이블을 이용한 탐색 : 해싱(hashing)
보통의 탐색 방법들은
입력된 탐색 키를 저장된 키 값과 반복적으로 비교해서 탐색을 원하는 항목에 접근한다.
그와 달리
해싱(Hashing)은
키 값에 " 직접 산술적인 연산(해시함수 : hash function)을 적용해서
그 키값에 맞는 언제나 동일한 해시코드를 결과(*해시 테이블 주소 : index )로 받아 항목에 접근하는 방식이다.
이렇게
하나의 키 값을 동일한 해시 함수에 적용하면 " 언제나 같은 값의 해시코드(HashCode)가 나와야 한다." 라는 규칙을 통해
< 데이터 무결성 >을 유지한다.
또한,
index를 통해 방대한 양의 데이터가 분류가 되어있기 때문에
데이터가 많더라도 개수에 비해 탐색이 매우 빠르다.
Hashing
)" 과 "암호화(Encryption
)" 의 차이우선 이 두가지 작업은 사용하는 경우가 다르다.
먼저
암호화는 보통 복호화와 같이 붙어다니는데
송수신자 사이에 주고받는 과정에서 제 3자의 접근 및 데이터 노출을 막는 것이 목적이고
해싱은 해시값을 검사해서 데이터 변조가 없었는지 '무결성'을 확인하는 것이 목적이라고 할 수 있다.
다음으로
작업면으로는
우선 암호화에선 인코딩(부호화 : encoding)과 디코딩(복호화 : decoding)의 작업을 통해
송신자는 제 3자는 알 수 없는 값으로 부호화 시키고
수신자는 부호화된 값을 원본으로 복호화를 함으로서 데이터를 보호한다.
해싱은
해싱 알고리즘(hashing algorithm)을 통해
해시값을 통해 접근 및 비교 검색을 해서 " 데이터의 중복이 있는지 " & " 변조가 되진 않았는지 " 검사하는 것이다.