본문 바로가기

자바

[자바] Comparable, Comparator

[Comparable]

docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#method.summary

 

Comparable (Java Platform SE 8 )

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method. Lists (and arrays) of o

docs.oracle.com

Comparable 문서를 보면 알겠지만 compareTo(T o) 메소드 하나만 선언이 되어있음을 알 수 있다. 즉, Comparable 을 사용하고자 한다면 compareTo(T o) 메소드를 Override 해주어야 한다.

 

[Comparator]

docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary

 

Comparator (Java Platform SE 8 )

Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. In the foregoing description, the notation sgn(expression) designates the mathematical s

docs.oracle.com

Comparator는 선언된 메소드가 많지만 실질적으로 자주 사용하는 메소드는 compare(T o1, T o2) 이다.

 

Comparable, Comparator 인터페이스 사용 이유

int a = 1;
int b = 3;
if(a>b) System.out.println(a);
else System.out.println(b);

일반적인 primitive 타입의 변수는 위와같이 부등호를 통해 변수의 비교가 쉽다.

public class Test {
    public static void main(String[] args) {
        People people1 = new People("sebang", 29);
        People people2 = new People("nebang", 25);
    }
}
class People{
    String name;
    int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

하지만 위와같이 객체간의 비교를 하고자 할때에는 어려움을 겪는다.

이때 필요한 인터페이스가 Comparable, Comparator이다.

Comparable은 자기자신과 매개변수 객체를 비교, Comparator는 두개의 매개변수 객체를 비교하는 것이다.

Comparable

package String;

public class Test {
    public static void main(String[] args) {
        People people1 = new People("sebang", 29);
        People people2 = new People("nebang", 25);
    }
}
class People implements Comparable<People>{
    String name;
    int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(People o) {
        if(this.age>o.age)
            return 1;
        else if (this.age==o.age)
            return 0;
        else return -1;
    }
}

필수 구현 부분인 compareTo(T o)  메소드를 통해  비교문을 만들 수 있다.

자기 자신인 People과 다른 People을 비교하기위해 Comparable<>에서 <> 이부분에 People 객체를 넣었다.

자기 자신인 People가 다른 People의 나이보다 많으면 1을, 같으면 0을, 적으면 -1을 반환하게 하여 자기 자신과 다른 사람의 차이값을 반환하게 하였다.

@Override
    public int compareTo(People o) {
        return this.age - o.age;
    }

다만 이런식으로 자신과 다른사람의 나이차이 자체를 반환하는 방법도 있다.

public class Test {
    public static void main(String[] args) {
        People people1 = new People("sebang", 29);
        People people2 = new People("nebang", 25);
        int whoIsBig = people1.compareTo(people2);

        if(whoIsBig>0){
            System.out.println("1번이 2번보다 많습니다.");
        }
        else if(whoIsBig==0){
            System.out.println("두 객체의 나이가 같습니다.");
        }
        else {
            System.out.println("1번이 2번보다 적습니다.");
        }
    }      //1번이 2번보다 많습니다.
}
class People implements Comparable<People>{
    String name;
    int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(People o) {
        return this.age - o.age;
    }
}

다만 두 값의 차이를 이용한 방식이기 때문에 각 자료형의 최댓값과 최솟값을 넘어가 overflow가 일어나지 않도록 주의해야 한다.

 

 

Comparator

 

public class Test {
    public static void main(String[] args) {
        People people1 = new People("sebang", 29);
        People people2 = new People("nebang", 25);
        People people3 = new People("dobang", 27);
        int whoIsBig = people1.compare(people2, people3);

        if(whoIsBig>0){
            System.out.println("2번이 3번보다 많습니다.");
        }
        else if(whoIsBig==0){
            System.out.println("3번과 3번의 나이가 같습니다.");
        }
        else {
            System.out.println("2번이 3번보다 적습니다.");
        }
    }
}
class People implements Comparator<People> {
    String name;
    int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int compare(People o1, People o2) {
        return o1.age - o2.age;
    }
}

people1의 객체의 compare 메소드를 통해 비교하지만, 객체 내부의 작동방식을 살펴보면 두 매개변수인 people2와 people3이 비교되는것이기 때문에 people1과는 관련없이 두 객체의 비교값을 반환한다.(people1.compare(people1,people2) 사용시 peopl1과 비교 가능)

 

 

 

출처 : https://st-lab.tistory.com/243

 

'자바' 카테고리의 다른 글

[자바] 힙(heap)과 스택(stack) 메모리 구조  (0) 2023.01.18
[자바] BufferedReader / StringTokenizer  (0) 2023.01.15
[자바] CompareTo  (0) 2023.01.13
[자바] 람다식 개념 및 표현법  (0) 2023.01.12
HashSet기초 (자바)  (0) 2023.01.07