티스토리 뷰

Goal 

 - Set 인터페이스에 대해 알아본다 

 - HashSet 클래스에 대해 알아본다 

 - TreeSet 클래스에 대해 알아본다.

 

1. Set 인터페이스

 - Collection 하위의 인터페이스

 

 - 중복을 허용하지 않음

 

 - List는 순서기반의 인터페이스지만, Set은 순서가 없음(TreeSet클래스는 순서 존재).

 

 - get(i) 메서드가 제공되지 않음 (Iterator로 순회)

 

 - 저장된 순서와 출력순서는 다를 수 있음.

 

 - 아이디, 주민번호, 사번 등 유일한 값이나 객체를 관리할 때 사용

 

 - HashSet, TreeSet 클래스

 

 

1-1 Set은 중복을 허용하지 않는다.

 - Set을 사용할 때는 중복을 허용하지 않기 위해, 관리할 Object가 논리적으로 같다는 것을 구현해 놓아야 한다 (equals() and HashCode()), 그렇지 않으면, 중복된 값이 Set에 담길 수 있다.

 

1-2 Iterator로 순회하기

 - 순서대로 저장되지 않는 set인터페이스의 특성상, Iterator객체를 통해 반복을 수행한다.

 

 - Collection의 개체를 순회하는 인터페이스

 

1) iterator() 메서드 호출

Iterator ir = memberArrayList.iterator();

2. HashSet 클래스 

 - Set 인터페이스를 구현한 클래스

 

 - 중복을 허용하지 않으므로 저장되는 객체의 동일함 여부를 알기 위해 equals()와 hashCode() 메서드를 재정의 해야 함. 

 

2-1 HashSet으로 맴버 관리하기

 

3. TreeSet 클래스 

 - 객체의 정렬에 사용되는 클래스

 

 - 중복을 허용하지 않으면서 오름차순이나 내림차순으로 객체를 정렬 함

 

 - 내부적으로 이진 검색 트리(binary search tree)로 구현되어 있음

 

 - 이진 검색 트리에 자료가 저장 될 때 비교하여 저장될 위치를 정함

 

 - 객체 비교를 위해 Comparable이나 Comparator 인터페이스를 구현 해야 함.

 

3-1 Comparable 인터페이스와 Comparator 인터페이스

 - 정렬 대상이 되는 클래스(member)가 구현해야 하는 인터페이스

 

 - Comparable은 compareTo() 메서드를 구현하고, 매개 변수와 객체 자신(this)를 비교함.

1) compareTo 구현 예시 코드

    public int compareTo(Member member) {
        return (this.memberId - member.memberId);
    }

 

 - Comparator는 compare() 메서드를 구현하고, 두 개의 매개 변수를 비교함.

2) compare 구현 예시 코드

    //첫번째 매개변수가 this, 두 번째 매개변수가 넘어온 member값
    public int compare(Member member1, Member member2) {
        return (member1.memberId - member2.memberId); //오름차순으로 정렬
    }

 

 - Comparator는 TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달해야 최종적으로 사용 가능.

3) Comparator가 구현된 Member객체를 TreeSet에 주입.

    public MemberTreeSet() {
        treeSet = new TreeSet<Member>(new Member());
        // TreeSet의 생성자에 Member default constructor(new Member())를 적용하여, 정렬의 기준을 주입함.  
        
    }

 - 일반적으로 Comparable을 더 많이 사용함.

 

 - 이미 Comparable이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의할 수 있음.

4) String을 TreeSet으로 기본 정렬

 - 출력결과는 "강감찬" -> "이순신" -> "홍길동"

 

 - String에 기본적으로 Comparable인터페이스가 구현되어 있기 때문에 값을 오름차순으로 정렬함.

import java.util.TreeSet;

public class TreeSetTest {

    public static void main(String[] args) {
        
        TreeSet<String> treeSet = new TreeSet<String>();
        treeSet.add("홍길동");
        treeSet.add("강감찬");
        treeSet.add("이순신");
        
        /*String에 Comparable인터페이스가 구현되어 있기 때문에
         * 값들이 기본적을 오름차순으로 정렬되어 출력됨.  
         */
        
        for (String str : treeSet) {
            System.out.println(str);
        }

    }

}

 

5) Comparator를 새롭게 정의하여 다른 정렬 방식 적용하기

 - MyCompare클래스를 통해 Comparator를 정의하고, TreeSet 생성자에 Comparator가 정의된 MyCompare클래스를 주입하면, Comparator가 Comparable보다 우선시 되어, Comparator에서 정의한 정렬 방식으로 값이 정렬됨

 

 - MyCompare에서는 내림차순 방식으로 Comparator를 정의했기 때문에 출력 결과는

 

 - "홍길동" -> "이순신" -> "강감찬"임.

class MyCompare implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {
       
        return s1.compareTo(s2) * (-1);
    }
    
    
    
}

public class ComparatorTest {

    public static void main(String[] args) {
        
        TreeSet<String> treeSet = new TreeSet<String>(new MyCompare());
        treeSet.add("홍길동");
        treeSet.add("강감찬");
        treeSet.add("이순신");
        
        for (String str : treeSet) {
            System.out.println(str);
        }
    }

}

 

- Comparable<Object>

1) 자료정리를 원하는 객체 타입에 Comparable적용

public class Member implements Comparable<Member> {

2) 원하는 방식으로 직접 compareTo메서드 정의

  //this와 넘어온 member의 맴버변수를 비교한다.
    @Override
    public int compareTo(Member member) {
        return (this.memberId - member.memberId); //양수이면 오름차순 정렬
     // return (this.memberId = member.memberId) * (-1); 내림 차순 정렬
     // return this.memberName.compareTo(member.getMemberName()); 문자열 오름차순 정렬
        
    }

 

 

- Comparator<Object>

1) 자료정리를 원하는 객체 타입에 Comparator 적용

public class Member implements Comparator<Member> {

2) 원하는 방식으로 직접 compare메서드 정의

    //첫번째 매개변수가 this, 두 번째 매개변수가 넘어온 member값
    public int compare(Member member1, Member member2) {
        return (member1.memberId - member2.memberId); //오름차순으로 정렬
    }

3) Comparator가 구현된 Member객체를 TreeSet에 주입.

 

    public MemberTreeSet() {
        treeSet = new TreeSet<Member>(new Member());
        // TreeSet의 생성자에 Member default constructor(new Member())를 적용하여, 정렬의 기준을 주입함.  
        
    }

 

 

'Java > Java 올인원 패키지' 카테고리의 다른 글

28. 람다식 (Java)  (0) 2020.03.23
27. 내부 클래스 (Java)  (0) 2020.03.21
24. List 인터페이스 (Java)  (0) 2020.03.19
23. 컬렉션 프레임워크 (Java)  (0) 2020.03.19
22. 제네릭 (Java)  (0) 2020.03.19
댓글