ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바8 - 다양한 정렬 방법
    카테고리 없음 2021. 1. 24. 23:09

    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가지의 정렬하는 방법을 적어보았습니다.

    어떤 방법이 무조건 더 좋다 라고 말할 수는 없으며 상황에 맞게 가독성과 재활용성을 생각하며 사용하면 되겠습니다.

    참조

    도서 - 모던 자바 인 액션

    틀린 부분이나 부족한 내용은 댓글로 남겨주시면 감사하겠습니다.

    반응형

    댓글

Designed by Tistory.