지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - Set 인터페이스
Map 인터페이스는 자료를 쌍(pair)으로 관리하는 데 필요한 메서드가 정의되어 있다. key-value 쌍으로 이루어진 객체의 key 값은 중복될 수 없고, value 값은 중복될 수 있다. Map 인터페이스를 구현한 클래스는 내부적으로 해시 알고리즘에 의해 구현되어 있다. 우선 가장 많이 사용하는 HashMap 클래스부터 보자.
HashMap 클래스
HashMap 은 Map 인터페이스를 구현한 클래스 중 가장 많이 사용한다. HashMap에서 자료를 관리하는 방식은 해시 방식이다. 해시 방식의 자료를 저장하는 공간을 해시 테이블이라고 한다. key 값이 정해지면 그에 대응하는 해시 테이블의 저장 위치가 정해지는데, 이런 위치를 계산하는 함수가 '해시 함수'다. 아래와 같이 해시 함수를 표현할 수 있다.
index = hash(key)
새로운 key-value 자료가 입력되거나, key를 알고 있는 상태에서 value를 검색하는 데 걸리는 시간은 산술적으로 계산할 수 있다. 그러므로 자료 추가 속도나 검색 속도가 상당히 빠르다는 장점이 있다.해시 함수를 어떻게 만드느냐는 key 값 특성이나 개발 프로그램 성격에 따라 다를 수 있다. 그런데 서로 다른 key 값에 같은 index가 반환되는 충돌(collision)이 발생하는 경우도 있다. 따라서 해시 테이블에 데이터를 꽉 채우지 않고 적정 수준이 되면 테이블을 확장해 충돌 발생 확률을 낮춘다. 또 Map 인터페이스에서 사용하는 key 값은 중복될 수 없으므로 equals( ) 메서드와 hashCode( ) 메서드를 재정의하여 사용하는 것이 좋다.
HashMap을 활용해 회원 관리 프로그램 구현하기
key 값은 회원 아이디, value는 회원 클래스로 구현한다. 컬렉션에서 사용한 Member 클래스를 그대로 사용한다.
key 값은 회원 아이디, value 값은 회원 클래스다. 8행에서 HashMap을 선언하고 10~12행 생성자에서 생성했다. 14~16행 addMember() 메서드에서 회원 아이디와 회원 클래스를 put( ) 메서드를 사용하여 추가한다. 18~25행 removeMember( ) 메서드에서는 매개변수로 key값인 memberID가 전달되었다. 우선 containsKey( ) 메서드를 호출하여 해당 key 값이 HashMap에 존재하는지 확인하고 존재하는 경우 key 값을 사용하여 삭제한다. 전체 회원을 출력하는 showAllMember( ) 메서드는 Map 인터페이스에 모든 자료를 한 번에 순회할 수 있는 방법이 없기에 먼저 key 값을 가져와서 key 값에 해당하는 value를 찾는다. 28행에서 hashMap.keySet( ) 메서드를 호출하면 모든 key 값이 Set 객체로 반환된다. 반환된 Set 객체에 Iterator( ) 메서드를 호출하면 key 값을 순회할 수 있는 Iterator가 반환된다. 그리고 모든 key 값을 하나씩 순회하면서 31행처럼 get( ) 메서드를 사용하여 해당 value 값을 가져온다. 이 외에 HashMap의 values( ) 메서드를 사용하면 key 값 없이 모든 value 값을 Collection 자료형으로 반환해 준다. key는 중복될 수 없으므로 반환형이 Set이고, value는 중복 가능하므로 Collection 자료형으로 반환해 준다.
key 값으로 쓰인 회원 아이디는 Integer형이다. Integer 클래스는 equals( ) 메서드와 hashCode( ) 메서드가 이미 재정의되어 있다. 테스트 코드를 구현하여 잘 실행되는지 확인하자.
HashMap과 Hashtable
HashMap과 Hashtable 클래스는 모두 쌍으로 이루어진 자료를 관리하는 데 사용된다. Hashtable 클래스는 Vector 클래스와 마찬가지로 멀티스레드를 위한 동기화를 제공한다. Vector 클래스에서 설명했듯, 멀티 스레드 환경이 아니라면 Hashtable 보다는 HashMap을 사용하자.
TreeMap 클래스
Map 인터페이스를 구현한 클래스 중 key 값으로 자료를 정렬하려면 TreeMap을 사용할 수 있다. TreeMap은 TreeSet와 마찬가지로 이진 검색 트리로 구현되어있다. key 값으로 정렬하므로 key 값에 해당하는 클래스에 Comparable이나 Comparator 인터페이스를 구현해야 한다.
회원 관리 프로그램에서 사용하는 key 값인 회원 아이디는 Integer형이다. Integer 클래스에는 이미 Comparable 인터페이스가 구현되어 있다. 따라서 이 예제에서는 따로 Comparable 인터페이스를 구현하지 않는다. 아래와 같이 관리 클래스와 테스트 클래스를 구현해보자.
참고 서적: 자바 프로그래밍 입문 - 박은종
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JAVA 입문 - 람다식 (0) | 2022.06.09 |
---|---|
JAVA 입문 - 내부 클래스 (0) | 2022.06.08 |
JAVA 입문 - Set 인터페이스 (0) | 2022.06.06 |
JAVA 입문 - List 인터페이스 (0) | 2022.06.05 |
JAVA 입문 - 컬렉션 프레임워크 (0) | 2022.06.04 |