CF_08_Comparable, Comparator 인터페이스

charl hi·2021년 9월 19일
0

JAVA_CF

목록 보기
8/12

정렬

  • 두 대상어떤 기준으로 비교해서 자리바꿈을 반복하는 것
  1. 불변 : 대상, 비교해서 자리바꿈

  2. 가변 : 기준

-> 이 정렬기준을 제공하는 것이
-> compareTo(), compare() 등의 객체 정렬에 필요한 메소드


Comparable 인터페이스

  • 객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스

  • 기본 정렬기준(default)을 구현하는 데 사용

compareTo(Object o)

  • int compareTo(Object o)

  • 주어진 객체 o 를 자신(this)과 비교

  • 자신(this)이 o보다 크면 1, 같으면 0, 작으면 -1 반환


Comparator 인터페이스

  • 객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스

  • 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용한다.

compare(Object o1, Object o2)

  • int compare(Object o1, Object o2)

  • 주어진 두 객체 o1, o2 비교

  • o1이 o2보다 크면 1, 같으면 0, 작으면 -1 반환



compareTo(), compare()

  • 이 두 메소드는 두 객체의 비교결과(-1, 0, 1) 를 반환하도록 작성
  1. ✨✨✨String, Integer, Float, .... 등의 클래스들이 Comparable 인터페이스, Comparator 인터페이스 implements
  • class String implements Comparable, class Integer implements Comparable ... 이런식으로

  • ✨✨참고로 String, Integer 등은 Comparator를 구현하지 않았다!! Comparable만!!!
  1. 이 클래스 안에서 compareTo(), compare()를 구현



sort()

sort(Object[] a)

  • static void sort(Object[] a)

  • 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬

  • ✨✨이미 그 객체 안에 compareTo()가 구현되어 있다.
    -> ✨기본정렬기준 : 사전순, 오름차순 ...


sort(Object[] a, Comparator c)

  • static void sort(Object[] a, Comparator c)

  • 객체배열 a는 대상, c는 기준

  • 지정한 Comparator에 의한 정렬
    -> ✨특정 기준 : 내림차순 ...

  • ✨✨우리는 sort를 신경쓰지 말고, 정렬기준인 Comparator 만 신경쓰면 된다!!
String[] strArr = {"cat", "Dog", "lion", "tiger"};
...
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
//대소문자 구별 안함
//String클래스 안에 Comparator를 구현, compare()를 구현하고 있으며, 대소문자를 구별안하는 결과를 반환하여 CASE_INSENSITIVE_ORDER멤버가 받는다. 그걸 우리가 호출함 

-> strArr = [cat, Dog, lion, tiger]


ex11_07

import java.util.Arrays;
import java.util.Comparator;

public class Ex11_07 {

	public static void main(String[] args) {
		String[] strArr = {"cat", "Dog", "lion", "tiger"};
		
		Arrays.sort(strArr);
		//String의 Comparable구현(compareTo()구현)에 의한 정렬+사전순 정렬
		System.out.println("strArr = "+Arrays.toString(strArr));
		
		Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
		//String의 Comparator구현(compare()구현)+대소문자 구별 안함
		System.out.println("strArr = "+Arrays.toString(strArr));

		Arrays.sort(strArr, new Descending());
		//이번엔 직접 만든 기준을 담은 객체를 호출한다.+역순
		System.out.println("strArr = "+Arrays.toString(strArr));
		
	}

}

//기존의 compare()를 역순을 배출하는 메소드로 오버라이딩하기
//따라서 compare()를 갖고 있는 Comparator를 구현해야 한다.
class Descending implements Comparator{
	public int compare(Object o1, Object o2) {
		//Comparable이 o1, o2의 조상타입클래스 또는 구현된인터페이스라면
		//이 문제에선, String implements Comparable 이므로 true
		//왜 Comparable?? : compareTo()를 쓰려고
		if(o1 instanceof Comparable && o2 instanceof Comparable) {
			Comparable c1 = (Comparable)o1;
			Comparable c2 = (Comparable)o2;
			return c1.compareTo(c2) * -1;
//			return c2.compareTo(c1);
		}
		return -1;	
		//비교대상이 Comparable을 구현한 클래스가 아니면 비교할 수 없기에 
	}
	
	
}

strArr = [Dog, cat, lion, tiger]
strArr = [cat, Dog, lion, tiger]
strArr = [tiger, lion, cat, Dog]

링크텍스트


✨✨✨기억해야 할 것

1. 선언부 : 두 객체를 받기 위해

1) implements Comparator

2) compare(o1, o2) 오버라이딩

2. 구현부 : 실제 compare() 구현부 안에서 비교할 땐

1) instanceof Comparable

2) Comparable c1, Comparable c2

3) c2.compareTo(c1) : 역순일 때


두 객체를 받기 위해 compare()를 선언으로 쓰고,

실제 비교를 위해 compareTo()를 구현으로 쓴다.



CompareIntegerTest

import java.util.Arrays;
import java.util.Comparator;

public class CompareIntegerTest {

	public static void main(String[] args) {
		Integer[] arr = {30, 50, 40, 10, 20};
		//Integer을 한 이유는 Comparable, Comparator를 받아야 하니까?	
		
		//기본 정렬(오름차순)
		Arrays.sort(arr);
		System.out.println("arr = "+Arrays.toString(arr));
		
		//내림차순
		Arrays.sort(arr, new DescComp());
		System.out.println("arr = "+Arrays.toString(arr));

	}

}
//Comparable도, Integer도 되네! 
class DescComp implements Comparator{
	public int compare(Object o1, Object o2) {
		if(o1 instanceof Integer && o2 instanceof Integer) {
			Integer i1 = (Integer)o1;
			Integer i2 = (Integer)o2;
			return i1.compareTo(i2)*-1;
//			return i2.compareTo(i1);
		}
		return -1;
	}
}

arr = [10, 20, 30, 40, 50]
arr = [50, 40, 30, 20, 10]


✨👀클래스의 메소드 구현부분 보는 방법?

  1. 해당 클래스에 커서 -> ctrl+f3 : 클래스가 갖고 있는 멤버들을 보여준다.

  2. 메소드 검색!

  1. 클릭하면 메소드 구현부분을 볼 수 있다.




Ref

0개의 댓글