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

컬렉션 프레임워크 실습 { Set 인터페이스, HashSet, HashTable }

Ben의 프로그램 2023. 7. 21. 09:44
728x90
Set 인터페이스
순서와 상관없이 중복을 허용하지 않는 경우에는 Set 인터페이스를 구현한 클래스를 사용합니다. 예를 들어 회원 아이디, 주민등록번호, 사번, 주문 번호 등이 해당됩니다. Set 인터페이스를 구현한 대표 클래스에는 HashSet과 TreeSet 이 있습니다. 

 

HashTable
HashTable 에 대해서 잘 정리한 포스팅이 있다. 다음 포스팅을 통해 HashTable 에 대해서 알아보자.
https://mangkyu.tistory.com/102

 

HashSet 클래스
HashSet 클래스는 집합 자료 구조를 구현하며 중복을 허용하지 않습니다. 중복을 허용하지 않는다는 의미를 살펴보기 위해 다음과 같은 테스트 프로그램을 작성해보겠습니다. 
hashSet 을 생성한 다음 add( ) 메서드로 자료를 추가했습니다. 위 코드를 실행시켜보겠습니다. 
동일한 자료 'D'를 두번 추가했는데요. 출력되는 것을 보면 중복된 자료는 출력되지는 않은 것을 볼 수 있습니다. 이 출력 결과에서 우리는 두 가지 사실을 알 수 있습니다. 첫째, HashSet 에 중복된 값은 추가되지 않는다는 것입니다. 둘째, ArrayList 는 순서가 있는 자료 구조이기 때문에 추가한 순서대로 출력되지만, HashSet 은 자료가 추가된 순서와 상관없이 출력됩니다. 

 

HashSet 클래스활용 회원 관리 프로그램 구현
HashSet 을 활용하여 회원을 관리하는 프로그램을 구현해보겠습니다. 
HashSet 자료구조를 사용하여 멤버 클래스를 구현하였습니다. Set 자료구조는 index 가 없기 때문에 Iterator 를 활용하여 순환하여야 합니다. 이번에는 Test 클래스를 구현해보겠습니다. 
출력 결과를 보면 굉장히 직관적으로 이해되지 않는 것이 있죠. 같은 아이디 1003 을 가진 Park 회원과 Hong 회원이 정상적으로 등록되고 출력되는 것을 확인할 수 있습니다. HashSet 자료구조의 원래 목적대로라면 같은 데이터는 추가되지 않아야 합니다.
우선 앞선 HashSetTest 클래스에서는 우리가 직관적으로 이해하는 HashSet 처럼 중복을 허용하지 않았습니다. 그 이유는 HashSet 에 추가한 String 객체가 equals 메서드와 hashCode 메서드를 Override 된 상태였기 때문입니다. 현재 우리가 사용하고 있는 member 클래스에 다음 코드를 추가해줍니다.
현재 우리 예제인 Member  클래스에 equals 메서드와 hashCode 메서드를 Override 했습니다.
( 논리적으로 같은 자료를 같다고 하기 위해서 equals 메서드와 hashCode 메서드 Override 하는 이유가 궁금하면 다음 포스트를 참고해주세요 : https://benprogram.tistory.com/104 )
Member 클래스에 equals 메서드와 HashCode 메서드를 override 한 이후 MemberHashSetTest 를 다시 실행하면 위와 같이 우리가 이해한 대로 논리적인 동일성을 판단하는 것을 확인할 수 있습니다.