JDK 1.8 이상 사용을 기준으로 하는 내용입니다.
class Apple{
private int weight;
Apple(int weight) {
this.weight = weight;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
위와 같은 Apple 클래스를 이용하여 간단한 정렬을 하겠습니다.
List<Apple> list =
Arrays.asList(new Apple(200), new Apple(100), new Apple(150));
리스트에 3개의 Apple 객체를 생성하여 넣어 사용하겠습니다.
Comparator 를 이용한 정렬
Comparator
를 생성하여 정렬을 구현하게 됩니다.
public class AppleComparator implements Comparator<Apple> {
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
}
list.sort(new AppleCompartor());
위와 같이 AppleComparator 를 구현하여 정렬할 수 있습니다.
한번만 사용할 정렬에 Comparator
를 매번 생성하는 것은 조금 귀찮은 일입니다. 그래서 익명 클래스를 사용하는 것으로 변경해보겠습니다.
익명 클래스를 이용한 정렬
list.sort(Compartor<Apple>(){
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
});
Comparator
가 들어가는 자리에 익명 클래스로 Comparator
를 생성하여 사용했습니다.
람다를 활용한 정렬
위에서 사용한 익명 클래스는 람다로도 사용할 수 있습니다.
list.sort((a1, a2) -> a1.getWeight().compareTo(a2.getWeight()));
comparing 메소드를 이용한 정렬
comparing
메소드는 Comparator
인터페이스 내의 메소드 입니다.
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
keyExtractor
를 정해주면 이것을 기준으로 정렬하는 Comparato
를 반환합니다
list.sort(comparing(apple -> apple.getWeight()));
따라서 Comparator 를 직접 구현하지 않고 키만 지정하며 사용할 수 있습니다.
메소드 참조를 이용한 정렬
위에서 사용한 comparing
메소드와 함께 메소드 참조를 이용하겠습니다.
list.sort(comparing(Apple::getWeight));
메소드 참조는 특정 메소드만을 호출하는 람다의 축양형이라고 할 수 있습니다.
메소드 참조를 사용하면 명시적으로 메소드 명을 참조하기 때문에 가독성을 높일 수 있습니다.
위에서 사용한 코드는 Apple 클래스에서 getWeight 메소드를 참조한 것으로
(Apple a) -> a.getWeight()
를 축약한 것 입니다.
결론
5가지의 정렬하는 방법을 적어보았습니다.
어떤 방법이 무조건 더 좋다 라고 말할 수는 없으며 상황에 맞게 가독성과 재활용성을 생각하며 사용하면 되겠습니다.
참조
도서 - 모던 자바 인 액션
틀린 부분이나 부족한 내용은 댓글로 남겨주시면 감사하겠습니다.
Uploaded by Notion2Tistory v1.1.0