티스토리 뷰

반응형

컬렉션 프레임워크(Collections Framework)에서 List는 '순서'를 기억하고 중요시하는 자료구조다. List의 담겨있는 객체의 특정 필드값을 기준으로 순서를 정렬하고 싶다면 Comparable 인터페이스와 Collections.sort()메소드를 사용한다. 


아래 간단한 예제를 보자.

public class Book implements Comparable<Book> {
    private String name;
    private int price;

    public Book(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }

    @Override
    public int compareTo(Book o) {
    return price-o.price;
    }
}

Book(책)이라는 클래스는 필드로 name(이름)과 price(가격)을 가지고 있다. 그리고 Book클래스를 만든 개발자는 이 클래스를 구현한 객체들간의 기본적인 정렬은 가격에 대한 오름차순으로 할 계획이였다. 그러기 위해 Comparable인터페이스의 compareTo()메소드를 위와같이 오버라이딩 했다. (드값을 get메소드가 아닌 필드값을 바로 명시해도 가능하다.)

 정렬을 담당하는 메소드(Collections.sort)가 어떤식으로 정렬을 진행할지 알아보자. 각 객체들의 compareTo 메소드를 이용하여서 현재 compareTo메소드의 객체와 매개변수로 받은 다른 객체의 필드값 price의 차(-)를 사용한다. compareTo메소드의 반환값은 int인데 만약 두 필드값의 차가 양수이면 현재 객체(메소드를 호출한 객체)가 뒷쪽으로 이동하고, 0이라면 두 필드의 값이 같으니 정렬이 유지되고, 두 필드값의 차가 음수라면 현재 객체가 앞쪽에 위치하게 된다. 정렬을 담당하는 메소드는 이런식으로 하나씩 비교해서 각 객체들을 정렬한다. 이 원리를 이용하면 오름차순으로 진행할지 내림차순으로 진행할지 개발자가 결정 할 수 있다.  실습을 직접 진행해본다면 이해하기 어렵지 않을 것이다.

public class SortTester {
    public static void main(String[] args) {
        ArrayList<book> bookList = new ArrayList<>();
        bookList.add(new Book("자바의정석", 9000));
        bookList.add(new Book("홍길동전", 6000));
        bookList.add(new Book("김소월 시집", 8000));

        Collections.sort(bookList);
      }
}

실습을 위해 Book클래스를 이용하여서 3개의 Book객체를 생성하고 List에 담았다. 그리고 객체들간의 정렬을 하기위해서 Collections.sort()메소드를 사용했고 매개변수로 bookList를 주었다.

for (Book book : bookList) {
    System.out.println(book.getName()+":"+book.getPrice());
    //출력결과 (가격의 오름차순 정렬)
    //홍길동전:6000
    //김소월 시집:8000
    //자바의정석:9000
}

이제 이 List의 순서를 출력해보면 처음에 담았던 순서가 아닌 가격의 오름차순 정렬이 됐음을 알 수 있다.

내림차순으로 정렬하기 (정렬방식 변경하기)

@Override
public int compareTo(Book o) {
    //return price-o.price;
    return o.price-price;
}

compareTo메소드를 위와같이 변경해보자. 정렬 원리를 생각해서 양수로 리턴되던 값을 음수로 리턴되도록 필드값의 위치를 바꾸었다.

Collections.sort(bookList);
for (Book book : bookList) {
    System.out.println(book.getName()+":"+book.getPrice());
    //출력결과 (가격의 내림차순 정렬)
    //자바의정석:9000
    //김소월 시집:8000
    //홍길동전:6000    
}

이제 다시 정렬을 진행한 후, List의 순서를 출력해보면 가격의 내림차순 정렬이 됐음을 알 수 있다.



기본정렬 이외에 다른 방식으로 정렬하는 방법은 다음 포스팅을 참고 ☞ List 정렬하기 - 2. Comparator 인터페이스

반응형
댓글