개발이좋아

[Java] Collection Framework - Map 인터페이스 본문

Java

[Java] Collection Framework - Map 인터페이스

noobdev 2019. 12. 21. 20:50

자료구조를 효율적으로 관리하기 위한 Collection Framework 중 Map인터페이스는 자료를 키(Key)와 값(Value)으로 관리하는데 필요한 메서드가 정의되어 있다.

Key와 Value를 쌍으로 저장하기 때문에 자료검색의 유용한 인터페이스이다.

 

Key와 Value란 사람을 예로 들자면 아래 표와 같다.

Key Value
이름 이순신
나이 25
직업 개발자

Key값은 유일해야 한다. 하지만 Value값은 여러 개 있을 수 있고 또한 중복될 수도 있다.

예를 들어 위 표에서 직업이 여러 개 있는 사람은 Value값이 하나가 아닌 여러 개가 될 것이다.


 

 

출처 : https://www.javatpoint.com/java-map

위 사진은 Map 인터페이슬 구현하고 있거나 상속받은 인터페이스와 클래스들이다. 

실선은 상속을 의미하고 점선은 구현을 의미한다.

Map인터페이스를 구현하거나 상속받은 하위 클래스 중 가장 많이 사용되는 클래스는 HashMap이다.

 

 

HashMap을 예로 Map인터페이스를 생성하는 법을 설명하자면 아래와 같다.

HashMap<Key, Value> 참조변수명 = new HashMap<Key, Value>( );

Map<Key, Value> 참조변수명 = new HashMap<Key, Value>( );

첫 문장은 바로 HashMap으로 선언한 경우이고 아래는 Map 자료형으로 선언하였지만 HashMap으로 인스턴스를 만든 자동형 변환의 예제이다.

아래의 선언법은 가상 메서드 기법에 의해 같은 이름의 메서드가 Map과 HashMap에 정의되어 있을 때 HashMap 클래스의 메서드를 실행하게 된다.

 

 

Map인터페이스에서 자주 사용되는 메서드들은 다음과 같다.

 

메서드 설명
V put(K key, V value) key에 해당하는 value값을 Map에 저장
V get(K key) key에 해당하는 value 값을 반환
boolean isEmpty( ) Map이 비어있는지 여부를 true. false로 반환
boolean containsKey(Object key) Map에 해당 key가 있는지 여부를 true, false로 반환
Set keySet( )  Key 집합을 Set으로 반환 
Collection values( ) value를 Collection으로 반환 ( 중복 무관 )
boolean containsValue(Object value) Map에 해당 value가 있는지 true, false로 반환
V remove(key) key가 있는 경우 삭제
boolean remove(Object key, Object value) key가 있는 경우 key에 해당하는 value가 매개변수의 두 번째 인자와 일치할 경우 삭제

메서드들을 보면 Map인터페이스는 자료의 검색에 유용한 것을 알 수 있다.

 

 

 


(1) HashMap 클래스

HashMap 클래스는 Map인터페이스를 구현한 클래스 중 가장 많이 사용한다. 

HashMap에서 자료를 관리하는 방식은 해시 방식으로 자료를 저장하는 공간을 해시 테이블이라고 한다.

key 값이 정해지면 그 값에 해당하는 위치에 해시 테이블이 저장되고 '해시 함수'를 사용하여 저장된 테이블의 위치를 검색할 수 있다.

key를 알고 있는 상태에서는 value값을 검색하는데 걸리는 시간을 산술적으로 계산할 수 있어서 자료의 추가 속도나 검색 속도가 상당히 빠르다.

 

 

Map인터페이스에서 사용하는 Key값은 중복을 허용하지 않는다.

따라서 Map인터페이스를 사용할 시 equals( ) 메서드와 hashCode( ) 메서드를 재정의하는 것이 좋다.

 

 

 


(2) Hashtable

Hashtable은 HashMap과 거의 같다.

자료를 키와 값 쌍으로 관리하는 사용 되며 List 인터페이스에 Vector와 같이 멀티스레드를 위한 동기화를 제공하며,

단일 스레드 환경이라면 HashMap을, 멀티 스레드 환경이라면 Hashtable을 사용하는 편이 좋다.

 

※ 스레드 : 프로그램이 메모리에서 수행될 때의 작업 단위. 두 개 이상인 경우 멀티 스레드라고 함.

 

※ 동기화 : 두 개 이상의 스레드가 동싱에 실행되면 같은 메모리에 접근하기 때문에 변수의 값이나 메모리 상태에 문제가 생기는 등 무결성이 깨질 수 있음. 동기화는 스레드가 메모리에 동시에 접근하지 못하도록 순서를 맞추는 것을 의미함.

 

 


(3) TreeMap 클래스

TreeMap은 key값으로 자료를 정렬할 때 사용한다. 

TreeSet 클래스와 마찬가지로 이진 검색 트리로 구현되어 있으며 Key값으로 정렬하므로 key값에 해당하는 클래스에 Comparable이나 Comparator 인터페이스를 구현해서 정렬 방법을 지정해야 한다.

Comparable이나 Comparator 인터페이스를 구현할 때 반환 값이 양수라면 오름차순, 음수라면 내림차순, 0이라면 중복이기 때문에 추가되지 않는다.

 

※ String클래스와 Integer클래스는 이미 Comparable 인터페이스를 지정해놓았다.

 

※ 이진 검색 트리: 이름 그대로 검색의 유용한 구조를 가진 이진트리 방식의 자료구조로 새로 들어온 값이 비교하는 값보다 크다면 오른쪽 작다면 왼쪽으로 이동시키는 이진트리이다. 

 

 

 

 

그 외에 여러 메서드와 상세 내용은 오라클에서 제공하는 자바 레퍼런스를 확인하면 된다.

 

본 포스팅은 필자가 공부한 것을 정리해놓은 것으로 오류가 존재할 수 있습니다.

참고 : Do it! 자바 프로그래밍 입문, 
https://www.javatpoint.com/

https://docs.oracle.com/javase/8/docs/api/
Comments