[JAVA] 컬렉션 프레임웍 : Map

DongGyu Jung·2022년 2월 24일
0

자바(JAVA)

목록 보기
37/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕

*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.



🔑 HashMap

HashtableTreeMap, SortedMap 같이 Map 인터페이스를 구현한 대표적인 컬렉션 클래스로
데이터를 " 의 쌍 (Entry) "으로 저장하는 특징을 가지고 있다.

  • " 순서 X " & " : 중복 허용X / : 중복 허용 "
    ( " 순서를 유지 " ▶ LinkedHashMap 을 사용 )
  • "해싱(hashing)" 을 사용해서 많은 양의 데이터 검색 기능이 뛰어나다.

HashtableHashMap의 관계는
이전에 살펴봤던 〔 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)을 통해
해시값을 통해 접근 및 비교 검색을 해서 " 데이터의 중복이 있는지 " & " 변조가 되진 않았는지 " 검사하는 것이다.

0개의 댓글