Comparable<T> Interface란?

2023. 2. 11. 01:26Java

저는 백준 11650, 11651번 문제를 해결하기 위해 이것저것 찾아보다가 발견하게 되었습니다.

 

보통 이 문제의 해결 과정을 찾아보면 2차원 배열을 사용하여 정렬하는 방법을 알려주긴 합니다.

 

Q. Comparable<T>란?

A. Collections의 sort() 메서드를 위해 사용되는 인터페이스입니다.

 

즉, Comparable<T>를 implements 하는 것으로 Collections.sort()의 정렬 기준을 재정립 할 수도 있습니다.

 

일반적으로 컴퓨터에서 데이터의 비교는 비교연산자를 통해 손쉽게 가능합니다.  때문에 sort() 메서드는 이러한 과정을 통해 컬렉션의 내부 요소를 비교하고 정렬합니다.

 

하지만 만약 비교하고자 하는 대상이 기본 자료형이 아는 객체일 경우에는 애로사항이 발생하게 됩니다.

 

예시로 x좌료와 y좌표라는 값을 가지는 Point라는 클래스가 존재할때에 이를 예시로 들어보겠습니다.

 

x좌표를 기준으로 정렬할 것인지 또는 y좌표를 기준으로 정렬할 것인지 컴퓨터는 알 수 없습니다. 이를 사용자가 지정해주지 않았기 때문입니다. 그렇기 때문에 우리는 Comparable<T> 인터페이스를 사용하여 이를 명시해주어야합니다.

 

사용방법은 Comparable<> 인터페이스를 implements한 후, compareTo() 메서드를 Override하여 compareTo() 메서드를 구현하는 것으로 Collections.sort()의 정렬 기준을 만들어 줄 수 있습니다.

 

CompareTo()메서드에서 반환값에 따라 정렬되는 순서가 다릅니다. 이때에 리턴값이 양수라면 오름차순, 음수라면 내림차순으로 정렬이됩니다.

 

글로만 설명하는 것으로는 설명이 어렵기도 하고 이해도 어려울 수 있으니 실제 코드를 보면 이해가 쉬울것이라 생각합니다.

 

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());
        ArrayList<Point> points = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String[] line = br.readLine().split(" ");
            int x = Integer.parseInt(line[0]);
            int y = Integer.parseInt(line[1]);
            points.add(new Point(x, y));
        }
        
        Collections.sort(points);
        for (int i = 0; i < n; i++) {
            Point p = points.get(i);
            sb.append(p.x).append(" ").append(p.y).append("\n");
        }
        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }
}

class Point implements Comparable<Point> {
    int x;
    int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public int compareTo(Point o) {
        if (this.y == o.y) {
            return Integer.compare(this.x, o.x);
        }
        return Integer.compare(this.y, o.y);
    }
}

Point라는 클래스에 Comparable<T> 인터페이스를 implements하여 Collections.sort() 메서드를 사용할때 어떻게 정렬하게 될것인지를 직접 구현해주었고, 이를 통해 구분되게 하였습니다.