[그린컴퓨터] Server/JAVA(자바 JDK)

(컬렉션프레임워크)Map 인터페이스 { HashMap, Hashtable }

Ben의 프로그램 2023. 7. 25. 10:35
728x90
Map 인터페이스 란?
Map 인터페이스는 자료를 쌍(Pair)으로 관리하는 데 필요한 메서드가 정의되어 있습니다. key-value 쌍으로 이루어진 객체의 key 값은 유일하며 value 값은 중복될 수 있습니다. Map 인터페이스를 구현한 클래스는 내부적으로 해시 알고리즘에 의해 구현되어 있습니다. 

 

Hash 란?
Map 인터페이스를 구현한 클래스 중 가장 많이 사용하는 클래스는 HashMap 클래스이다. HashMap 클래스는 이름에서 의미하는 바와 같이 자료를 해시 방식으로 관리하는데, Hash 에 대한 내용은 다음 글을 참고하자.

https://medium.com/@su_bak/crypto-%ED%95%B4%EC%8B%9C-hash-%EB%9E%80-6962be197523

 

HashMap 클래스 개요
HashMap 은 Map 인터페이스를 구현한 클래스 중 가장 많이 사용합니다. HashMap 에서 자료를 관리하는 방식은 해시 방식입니다. 해시 방식의 자료를 저장하는 공간을 해시 테이블이라고 합니다. key 값이 정해지면 그에 대응하는 해시 테이블의 저장 위치가 정해지는데 이런 위치를 계산하는 함수가 '해시 함수' 입니다. 새로운 key-value 자료가 입력되거나, key 를 알고 있는 상태에서 value 를 검색하는 데 걸리는 시간은 산술적으로 계산할 수 있습니다. 그러므로 자료 추가 속도나 검색 속도가 상당히 빠르다는 장점이 있습니다. 해시 함수를 어떻게 만드느냐는 key 값 특성이나 개발 프로그램 성격에 따라 다를 수 있습니다. 따라서 해시 테이블에 데이터를 꽉 채우지 않고 적정 수준이 되면 테이블을 확장해 충돌 발생 확률을 낮춥니다. Map 인터페이스에서 사용하는 Key 값은 중복될 수 없는 특징이 있으므로 식별자로 사용하기 위해 equals( ) 메서드와 hashcode( ) 메서드를 재정의하여 사용하는 것이 좋습니다. 

 

HashMap 클래스 실습 : MemberHasnMap 클래스 구현
HashMap 을 활용하여 회원 관리 프로그램을 만들어보도록 하겠습니다. key 값은 회원 아이디, value 는 회원 클래스로 구현하겠습니다. 

우선 컬렉션 패키지에서 사용한 Member 클래스를 그대로 사용하고 관리(구현) 클래스와 테스트 클래스를 구현해보겠습니다. 

코드를 살펴보겠습니다. MemberHashMap 클래스는 HashMap 자료형 변수인 hashMap 을 갖고 있습니다. key 값은 memberId, value 는 member 객체입니다. hashMap 에 새로운 값을 넣을 때는 put( ) 메서드를 사용하는 것을 볼 수 있습니다. hashMap 에서 자료를 삭제할 때는 remove( ) 메서드를 사용하는 것을 볼 수 있습니다. hashMap 에 들어있는 모든 자료를 확인하기 위해서는 Interator 를 활용하여 자료를 순환하고 있는 것을 확인할 수 있습니다. 여기서 key 값으로 사용된 memberId 는 Integer 자료형입니다. Integer 는 이미 equals( ) 메서드와 hashCode( ) 메서드가 재정의 되어 있으므로 다시 재정의할 필요가 없습니다. 테스트 코드를 구현하여 잘 실행되는지 확인해보도록 하겠습니다. 

 

HashMap 클래스 실습 : MemberHashMap 클래스 테스트
MemberHashMapTest 테스트 클래스를 구현하고 실행해 보겠습니다.

실행하고 출력 결과를 함께 살펴보겠습니다. 

모든 회원이 잘 추가되었고 삭제도 잘 진행된 것을 확인할 수 있습니다. 이처럼 쌍으로 된 자료는 HashMap 을 사용하여 관리하면 편리합니다. 

 

HashMap 과 Hashtable
HashMap 과 Hashtable 클래스는 모두 쌍으로 이루어진 자료를 관리하는 데 사용됩니다. Hashtable 클래스는 자바 1부터 사용되었는데요. Hashtable 은 이전에 살펴보았던 Vector 클래스와 마찬가지로 멀티스레드를 위한 동기화를 제공합니다. Vector 클래스에서 설명했듯이 멀티스레드 환경이 아니라면, Hashtable 보다는 HashMap 을 사용하는 것을 권장합니다. 

Vector 클래스에서 설명한 멀티스레드 관련 포스팅입니다.
https://benprogram.tistory.com/319

 

출처 : boostcourse 웹 프로그래밍(풀스택) 
https://www.boostcourse.org/web316/lecture/20655?isDesc=false