새소식

💻 Computer/🦀 Java

[Java] Comparable<T> , Comparator<T>

  • -
이게 뭔데?

객체를 비교, 정렬하는 것이다.

 

Comparable과 Comparator의 차이점

 

Comparable은 자기 자신의 객체와 비교하는것

 

Comparator은 다른 객체와 비교하는 것이라는 차이점이 있다.

 

어떻게 쓰는 거?
import java.util.Arrays;

class Person implements Comparable<Person>{
    int age;
    public Person(int age){
        this.age = age;
    }
    public int compareTo(Person o){
        return this.age - o.age;
    }
}


public class Main{
    public static void main(String[] args){
        Person[] arr = new Person[10];
        for(int i =0; i < arr.length; i++){
            arr[i] = new Person((int)(Math.random()*100));
        }

        Arrays.sort(arr);

        for(Person s: arr) System.out.println(s.age);
        
    }
}

객체끼리 비교할 때 기준을 정해 주는 것을 Comaprable이라고 한다

Comparable은 Interface이다 그렇기 때문에 꼭 객체에 compareTo()라는 함수를 Override 해줘야 한다.

//Interface Comparable

public interface Comparable<T> {
    public int compareTo(T o);
}

Generic으로 type T를 받는데 객체를 받는 것이다.

 

제일 위의 예제 코드를 살펴보자

class Person implements Comparable<Person>{
    int age;
    public Person(int age){
        this.age = age;
    }
    public int compareTo(Person o){
        return this.age - o.age;
    }
}

이 부분 처음 보면 어렵다.... 당황하지 말자 정훈아

 

implements로 Comparable <Person>을 상속받고 Generic type으로 Person 자기 자신을 넣어준다.

그 이유는 자기 자신과 비교하기 때문에 

 

그럼 compareTo 에서 return은 뭘 반환하는 걸까?라는 질문을 할 수 있다.

 

아까 말했듯이 Comaparable은 객체 비교의 기준을 정해 주는 거다

여기서 나는 정렬 기준을 age의 크기로 잡은 것이다 

return this.age - o.age

이 코드는 자기 자신의 객체와 배열에 저장한 다음 객체를 age의 크기로 비교한다

 

만약 [자기 자신 객체(this.age)] age =  3

[다음 객체(o.age)] age = 2

 

일 때 3 - 2를 한다면 양수가 나온다 양수가 나오면 서로의 값을 바꾸는 것이다

 

2-3이면 음수가 나오므로 바꾸지 않아도 된다.

 

사실 내가 설명하고 있는데 내가 이해한 대로 글로 쓰는 것이 어렵다........

 

Comparator

Comparator은 Comparable과 달리 자기 자신과 비교하지 않는다

 

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

class Person{
    int age;
    public Person(int age){
        this.age = age;
    }
}


public class Main{
    public static void main(String[] args){
        Person[] arr = new Person[10];
        for(int i =0; i < arr.length; i++){
            arr[i] = new Person((int)(Math.random()*100));
        }
        Arrays.sort(arr,test);

        for(Person s : arr){
            System.out.println(s.age);
        }
    }

    public static Comparator<Person> test = new Comparator<Person>() {
        public int compare(Person o1, Person o2) {
            return o1.age - o2.age;
        };
    };
}

익명 객체를 사용하여 정렬할 수 있다 Comparable과 비슷한 구조이다 하지만 파라미터를 두 개 즉

비교할 객체 두 개를 받는다.

'💻 Computer > 🦀 Java' 카테고리의 다른 글

[Java] Collection  (0) 2022.07.25
[Java] Generic  (0) 2022.07.23
[Java] String을 자세히  (1) 2022.07.22
[Java] Arrays.asList()은 무엇인가  (0) 2022.07.21
Java this 와 super  (0) 2022.07.17
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.