컴퓨터공학 💻 도서관📚

Part2. 5-14 정렬을 위해 Comparable과 Comparator 인터페이스 구현하기 (TreeSet 클래스) 본문

✅🌲강의 복습 노트/패캠 JavaSpring 강의,코드 복습

Part2. 5-14 정렬을 위해 Comparable과 Comparator 인터페이스 구현하기 (TreeSet 클래스)

들판속초록풀 2025. 6. 28. 10:39

TreeSet 클래스 활용하기

  • 객체의 정렬에 사용하는 클래스
  • Set 인터페이스를 구현하여 중복을 허용하지 않고, 오름차순이나 내림차순으로 객체를 정렬할 수 있음
  • 내부적으로 이진검색트리(binary search tree)로 구현됨
  • 이진검색트리에 저장하기 위해 각 객체를 비교해야 함
  • 비교 대상이 되는 객체에 Comparable이나 Comparator 인터페이스를 구현 해야 TreeSet에 추가 될 수 있음
  • String, Integer등 JDK의 많은 클래스들이 이미 Comparable이 구현되어 있음
  • Comparable은  java-lang 패키지 안에 있고 ,   Comparator은  java-util 패키지 안에 있다.

 

String 클래스는 이미 Comprable 인터페이스를 구현했기 때문에 문자열이 오름차순으로 정렬되어 출력된다

import java.util.TreeSet;

public class TreeSetTest {         // Test 야야야야야야야야야야야야

	public static void main(String[] args) {

		TreeSet<String> treeSet = new TreeSet<String>();   // String 클래스
		treeSet.add("홍길동");
		treeSet.add("강감찬");
		treeSet.add("이순신");
		
		for(String str : treeSet) {
			System.out.println(str);
		}
	}
}

 

(밑에꺼가 이 강의의 주인공 코드)

import java.util.TreeSet
import java.util.Iterator

public class MemberTreeSet {       // Member 클래스 집합 (이 강의에서 이 코드가 주인공임)

	private TreeSet<Member> treeSet;       // Member 클래스 집합

	public MemberTreeSet(){                // 생성자
		treeSet = new TreeSet<Member>();
	}
    
    /* 
    	public MemberTreeSet(){
		treeSet = new TreeSet<Member>( new Member() );  // Comparator 쓸 때 이렇게 해야 함
	}
    */
	
	public void addMember(Member member){
		treeSet.add(member);
	}
	
	public boolean removeMember(int memberId){
		
		Iterator<Member> ir = treeSet.iterator();       // 순회
		
		while( ir.hasNext()){
			Member member = ir.next();
			int tempId = member.getMemberId();
			if( tempId == memberId){
				treeSet.remove(member);
				return true;
			}
		}
		
		System.out.println(memberId + "가 존재하지 않습니다");
		return false;
	}
	
	public void showAllMember(){
		for(Member member : treeSet){
			System.out.println(member);
		}
		System.out.println();
	}
}
public class MemberTreeSetTest           // Test 야야야야야야야야야야야야

	public static void main(String[] args) {

		MemberTreeSet memberTreeSet = new MemberTreeSet();
		
		Member memberKim = new Member(1003, "김유신");
		Member memberLee = new Member(1001, "이순신");
		Member memberKang = new Member(1002, "강감찬");
		
		memberTreeSet.addMember(memberKim);
		memberTreeSet.addMember(memberLee);
		memberTreeSet.addMember(memberKang);
		memberTreeSet.showAllMember();
		
	}
}

 


 

직접 만든 Member클래스의 아이디가 오름차순으로 정렬되게 하기 위해서는 Comparable 이나  Comparator 인터페이스
둘 중에 하나를 구현해야 한다.

// Comparable 버전

public class Member implements Comparable<Member>{   // Member 클래스

	......

	@Override
	public int compareTo(Member member) {      // 반환형이 int ( 빼기로 대소비교 )

              return (this.memberId - member.memberId) * (-1);   //내림차순
            //return (this.memberId - member.memberId);          //오름차순
	}
}

 

 

 

Comparable은 매개변수가 1개이고(자기자신과 비교하기 때문)

Comparator는  매개변수가 2개이다.(2개의 매개변수를 비교)

 

 

Comparator를 쓸 때는 반드시  MemberTreeSet 클래스 생성자  매개변수에  내가 어떤 클래스로 구현을 해놨는지
Comparator 되는 대상을 여기다 써줘야 한다. (위에 주석으로 있음)

treeSet = new TreeSet<Member>( new Member() );

Comparable인 경우는 그냥 구현이 되는데 Comparator인 경우는 TreeSet 생성자 안에  Comparator가 구현된 얘를 지정을 해줘야 한다.

그리고  저 경우는 Member 클래스에    Member()  이 형태의 기본 생성자가 있어야 한다.

// Comparator 버전

public class Member implements Comparator<Member>{   // Member 클래스

	......

	@Override
	public int compare(Member member1, Member member2) {    // 매개변수가 2개
                                                // Comparator 은 메서드 이름이 compare

              return (member1.memberId - member2.memberId) * (-1);   //내림차순
            //return (member1.memberId - member2.memberId);          //오름차순
	}
}

 


Comparable은 일반적으로 많이 쓰고

Comparator은 언제 쓰냐면 

 

Comparator의 활용 : 이미 Comparable이 구현된 경우 Comparator로 비교하는 방식을 다시 구현할 수 있다

 

 

String 클래스 같은 경우는 JDK 안에서 이미 오름차순으로 정렬하는게 구현되어 있다.  (Comparable 이 구현되어 있다)

그런데 나는 지금 이 상태에서 String을 내림차순으로 구현하고 싶다고 하면 바꿀 수 있다.

 

MyCompare 라는 걸 하나 만들고  Comparator로 구현을 한다

-1을 곱해서 오름차순을 내림차순으로 바꿔버린다.

 

그리고 String에 대한 TreeSet을 선언할 때  Compare 하는 인자를  MyCompare을 줘버린다.

그러면 String이 Compare이 아니라  Comparator가 구현된 이 클래스에 의해서 비교가 된다.

이렇게 쓸 수 있다.

class MyCompare implements Comparator<String>{    // Comparator

	@Override
	public int compare(String s1, String s2) {    // 매개변수가 2개
		return (s1.compareTo(s2)) *-1 ;    // -1을 곱해서 양수가 음수가 되고 음수가 양수가 된다.
	}
}

public class ComparatorTest {
	
	public static void main(String[] args) {
		
		Set<String> set = new TreeSet<String>(new MyCompare()); // 인자를 MyCompare을 줘버리기
		set.add("aaa");
		set.add("ccc");
		set.add("bbb");
				
		System.out.println(set);
	}
}
Comments