복습용

21.Set 인터페이스

자바게 2020. 4. 6. 22:15

순서와 상관없이 중복을 허용하지 않는 경우에는 Set 인터페이스를 구현한 클래스를 사용합니다. 우리가 사용하는 데이터 중에 중복을 허용하지 않는 데이터는 어떤 것이 있을까요? 회원 아이디, 주민등록번호, 사번, 홈쇼핑 주문 번호 등은 중복되면 안 될 것입니다. Set 인터페이스를 구현한 대표 클래스에는 HashSet와 TreeSet가 있습니다.

 

HashSet 클래스

HashSet 클래스는 집합 자료 구조를 구현하며 중복을 허용하지 않습니다. 중복을 허용하지 않는다는 의미를 살펴보기 위해 다음과 같이 간단한 HashSet를 테스트하는 프로그램을 작성해 보겠습니다.

 

12~13행을 보면 hashSet에 동일한 자료 '강감찬'을 추가했습니다. 같은 문자열을 추가한 것입니다. 결과 화면을 보면 같은 자료는 중복되어 출력되지 않았습니다. 출력 결과에서 우리는 두가지 사실을 알수 있습니다. 

첫째 HashSet은 중복을 허용하지 않는 자료구조이다.

둘째 자료가 추가된 순서와 상관없이 출력됩니다.

 

HashSet를 활용해 회원 관리 프로그램 구현하기

 

클래스 생성

 

 

 

 

TreeSet 클래스

자바의 Collection 인터페이스나 Map 인터페이스를 구현한 클래스 중 Tree로 시작하는 클래스는 데이터를 추가한 후 결과를 출력하면 결과 값이 정렬됩니다. TreeSet는 자료의 중복을 허용하지 않으면서 출력 결과 값을 정렬하는 클래스입니다. TreeSet를 활용한 간단한 코드를 살펴보겠습니다.

 

 

정렬됨

TreeSet에 홍길동, 강감찬, 이순신 순으로 요소를 추가했습니다. 그런데 결과 값은 정렬되어 출력되었습니다. 그렇다면 정렬은 어떤 기준으로 이루어질까요? 자바는 정렬을 구현하기위해 '이진 트리(binary tree)'를 사용합니다.

 

이진 검색 트리

트리는 자료 사이의 계층 구조를 나타내는 자료 구조입니다. 트리 자료 구조를 자세히 설명하기보다는 TreeSet를 이해하기 위해 필요한 팁 = 넣으려는 수가 비교하는 수보다 적으면 왼쪽 크면 오른쪽으로 넣는다 그렇게 비교가 끝날때까지 함

 

 

 

hashSet 과 TreeSet에 쓰인 멤버 클래스

Comparable 인터페이스와 Comparator 인터페이스

Member 클래스가 가진 회원 아이디를 기준으로 하여 오름차순으로 정렬 할수 있게 해주는 인터페이스 입니다

 

자기 자신과 전달받은 매개변수를 비교하는 Comparable 인터페이스

Comparable 인터페이스에는 compareTo() 추상 메소드가 포함되어 있습니다. 따라서 이 인터페이스를 구현하는 Member 클래스에서 compareTO() 메소드를 구현해야 합니다.

 

위의 예제에서 재정의한 compareTo() 메소드의 의미는 다음과 같습니다. 비교 대상은 this의 회원 아이디, 즉 새로 추가한 회원의 아이디와 compareTo() 메소드의 매개변수로 전달된 회원 아이디입니다. 두 값을 비교하여 새로 추가한 외원 아이디가 더 크면 양수, 그렇지 않으면 음수, 같으면 0을 반환하도록 만들었습니다.

 

두 매개변수를 비교하는 Comparator 인터페이스

Comparator 역시 정렬을 구현하는 데 사용하는 인터페이스입니다. Comparater 인터페이스는 compare() 메소드를 구현해야 합니다. Member2 클래스를 새로 만들어 Comparator 를 구현한 코드는 다음과 같습니다.

 

16행에서 TreeSet 클래스를 생성할 때 생성자에 매개변수를 넣지 않으면 원라 String 클래스에 정의된 Comparable 인터페이스의 compareTO() 메소드 구현 내용대로 오름차순으로 정렬됩니다. 이 예제에서는 TreeSet 클래스 생성자에 Comparator 인터페이스를 구현한 MyCompare 인스턴스를 매개변수로 넣었기 떄문에, 재정의한 compare() 메소드 방식에 따라 내림차순으로 정렬 방식이 바뀝니다.