Comparator의 개념

bw1611·2023년 10월 30일
0

Comparator는 무엇일까?


Comparator는 Java에서 사용되는 인터페이스로, 객체를 비교하는 방법을 정의하는데 사용됩니다. 이 인터페이스는 두 개의 객체를 비교하고 정렬 순서를 결정하기 위한 메서드를 정의해줍니다.

public interface Comparator<T> {
    int compare(T o1, T o2);
}
  • compare 메서드는 o1이 o2보다 작은 경우 음수 값을 반환합니다.
  • compare 메서드는 o1이 o2보다 큰 경우 양수 값을 반환합니다.
  • compare 메서드는 o1과 o2가 같은 경우 0을 반환합니다.

그럼 이 Comparator를 사용하여 Person이라는 클래스를 나이순으로 정렬해보자!

class Person {
    private int age;
    private String name;

    public Person(int age, String name) {
        setAge(age);
        setName(name);
    }
    @Override
    public String toString() {
        return "나이 : " + getAge()+ " 이름 : "+getName();
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

우선 Person클래스를 선언해줍니다. Person 클래스에 나이와 이름을 넣어줍니다.

public class Study2 {
    public static void main(String[] args) {
        Person person1 = new Person(21, "Jisu");
        Person person2 = new Person(30, "Chan");
        Person person3 = new Person(29, "Woo");
        Person person4 = new Person(15, "Woo");
        Person person5 = new Person(49, "Woo");

        List<Person> list = new ArrayList<>();

		// List에 person을 넣어준다.
        list.add(person1);
        list.add(person2);
        list.add(person3);
        list.add(person4);
        list.add(person5);

        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
            	// 오름차순
                if (o1.getAge() < o2.getAge()) {
                    return -1;
                }
				// 내림차순
//                if (o2.getAge() < o1.getAge()) {
//                    return -1;
//                }

                // 오름차순
//                return o1.getNo() - o2.getNo();

                // 내림차순
//                return o2.getNo() - o1.getNo();

                return 0;
            }
        });

        for (Person person : list) {
            System.out.println(person);
        }
    }
}

o1.getAge() < o2.getAge()했을 때의 결과는 오름차순으로 나오는 것을 확인할 수 있다.

                if (o1.getAge() < o2.getAge()) {
                    return -1;
                }
                
                // 오름차순
//              return o1.getNo() - o2.getNo();
나이 : 15 이름 : Woo
나이 : 21 이름 : Jisu
나이 : 29 이름 : Woo
나이 : 30 이름 : Chan
나이 : 49 이름 : Woo

o2.getAge() < o1.getAge()했을 때의 결과는 내림차순으로 나오는 것을 확인할 수 있다.

                if (o2.getAge() < o1.getAge()) {
                    return -1;
                }
                
                // 내림차순
//              return o2.getNo() - o1.getNo();
                
나이 : 49 이름 : Woo
나이 : 30 이름 : Chan
나이 : 29 이름 : Woo
나이 : 21 이름 : Jisu
나이 : 15 이름 : Woo

그렇다면 이게 정렬이 동작하는 이유가 궁금해서 찾아봤다. (ChatGpt에게)

1, o1.getNo()가 o2.getNo()보다 작으면, o1.getNo() - o2.getNo()의 결과는 음수가 됩니다. 따라서 compare 메서드는 음수를 반환하게 되고, 이는 o1이 o2보다 앞서야 함을 의미합니다. 즉, o1이 o2보다 작은 값을 가지는 것으로 간주되므로 o1이 앞에 오게 됩니다.

2, o1.getNo()가 o2.getNo()와 같다면, o1.getNo() - o2.getNo()의 결과는 0이 됩니다. 따라서 compare 메서드는 0을 반환하게 되고, 이는 두 객체의 순서를 변경하지 않아야 함을 의미합니다.

3, o1.getNo()가 o2.getNo()보다 크면, o1.getNo() - o2.getNo()의 결과는 양수가 됩니다. 따라서 compare 메서드는 양수를 반환하게 되고, 이는 o1이 o2보다 뒤에 있어야 함을 의미합니다.

그렇다면 Compare에 대해서 조금 알아보도록하자! (Compare에 대해서 얘기를 들었으니!)

@Override
public int compare(인자1, 인자2){
 
    if(인자1 > 인자2){
      return 1;
    }else if(인자1 < 인자2){
      return -1;
    }else{
      return 0;
    }
}
  • compare의 특징은 객체를 비교하는 방식이다.
  • compare() 메서드는 Comparator 인터페이스를 구현할 때 구현해야하는 메서드이다.

참고 사이트
자바 문자열 비교 함수 compare(), compareTo()

profile
Java BackEnd Developer

0개의 댓글