-
자바[JAVA] - Comparable과 Comparator의 이해Java/자바의정석 2023. 2. 28. 15:02반응형
Comparable과 Comparator에 대해 알아보자
Comparable과 Comparator의 기본 개념
모두 인터페이스(Interface)로 구현되어있다.
즉, 사용하고자한다면 인터페이스 내에 선언된 메소드를 반드시 구현해야한다는 의미이다.
객체 비교를 하기위해 사용된다.Comparable은 무엇인가?
Comparable : 자기자신과 매개변수를 비교하는 것
우선 기본개념만 알고 자세히 알기위해 아래의 코드를 살펴보자.
public class compareTest { public static void main(String[] args) { int a = 1; int b = 2; if(a > b) { System.out.println("a가 b보다 큽니다."); }else if(a == b){ System.out.println("a와 b가 동일합니다."); }else{ System.out.println("a가 b보다 작습니다."); } } }
비교를 위해 사용이 되지만 왜 굳이 Comparable 을 사용하는가? 이와같이 연산자를 사용하여 비교하면 편할거라 생각한다.
Person p1 = new Person(170, 70); Person p2 = new Person(180, 80);
하지만 이와같이 Height,와 Weight로 구성되어있는 Person객체가 있다고 한다면 무엇을 기준으로 비교를 해야하는가?
체급으로 비교를하는지 신체로 비교를하는지 알수가없다. 이럴때 Comparable을 사용한다.
우선 Comparable이 어떻게 구성되어있는지부터 살펴보자.
public interface Comparable<T> { public int compareTo(T o); }
해당 인터페이스는 이와같이 구성되어있다.
class Person implements Comparable<Person>{ int weight; int height; Person(int weight, int height){ this.weight = weight; this.height = height; } @Override public int compareTo(Person o) { // 만약 자신의 weight가 o의 weight보다 크다면 양수가 반환 될 것이고, // 같다면 0을, 작다면 음수를 반환할 것이다. return this.weight - o.weight; } }
해당 제네릭스에 우리가 비교할 Person을 대입해준다. 그리고 기존에 Comparable은 자기자신을 기준으로 삼아 매개변수를 비교한다고 개념을 잡았다. 보통 -1,0,1 을 반환하는것이 일반적이지만 더 큰 폭으로 설명하자면 양수, 음수 혹은 0을 반환하는것이다. 여기서는 자기자신과 매개변수의 차이를 반환하도록 설정해두었다.
Person p1 = new Person(170, 70); Person p2 = new Person(180, 80); int big = p1.compareTo(p2); System.out.println("big==>" + big); if(big > 0){ System.out.println("p1객체가 p2객체의 체급보다 높습니다.."); }else if(big == 0){ System.out.println("p1객체와 p2객체의 체급은는 같습니다."); }else { System.out.println("p1객체가 p2객체의 체급보다 낮습니다.."); }
main에서 이와같이 같이 구성이 가능하다.
p1.compareTo(p2);
이와같이 p1(객체자신) 을 compareTo를 이용하여 p2(매개변수)와 비교를 하고있다.
Comparable 정리
자기 자신과 매개변수를 비교한다.
Comprable은 compareTo 메소드를 반드시 구현해야한다.
Comparator은 무엇인가?
두 매개변를 비교한다.
즉 자기 자신이 아니라 파라미터(매개 변수)로 들어오는 두 객체를 비교하는 것@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2);
Comparator는 위와같이 구성되어있다. 파라미터 두개의 값을 받아 두개의 객체를 비교하도록 구성되어있다.
이 때, 필수적으로 구현해야하는 compare() 메소드가 바로 객체를 비교할 기준을 정의해주는 부분이다.
class Person implements Comparator<Person>{ int weight; int height; Person(int weight, int height){ this.weight = weight; this.height = height; } @Override public int compare(Person p1, Person p2) { return p1.height - p2.height; } }
Comparator를 사용하기위해 인터페이스 상속을 받은 뒤에 비교기준을 세워줄 compare 메서드를 재정의하였다.
public class compareTest { public static void main(String[] args) { Person p1 = new Person(170, 70); Person p2 = new Person(175, 85); Person p3 = new Person(190, 90); int big = p1.compare(p2, p3); System.out.println(big); } }
이와같이 p1,p2,p3인스턴스를 생성한뒤 첫번째에
int big = p1.compare(p2, p3); System.out.println(big);
해당 코드를 실행한다면 p2.height - p3.height = -5값이 출력되어나온다.
Comparator는 자기자신이 아닌 매개변수의 값들을 비교하는것이다.
Comparator 정리
매개변수의 값들을 비교한다.
Comparator는 compare 메서드를 반드시 구현해야한다.반응형'Java > 자바의정석' 카테고리의 다른 글
자바[JAVA] - treeset()개념 및 여러가지 기능들 (0) 2023.03.09 [JAVA] 자바 - 제네릭스(generics)란? (0) 2023.03.08 자바 [JAVA] - HashSet개념 및 활용 (0) 2023.02.27 자바의정석 Comparator 활용하기 (0) 2023.02.27 자바의정석 Arrays여러가지 메서드 (0) 2023.02.27