Comparable 인터페이스 구현을 통한 정렬

Solar·2020년 2월 12일
0

JAVA

목록 보기
6/7

클래스가 정렬돼야 할 기준(오름차순/내림차순)이 하나인 경우 클래스가 Comparable 인터페이스를 구현하도록 설계할 수 있다. Comparable 을 구현하고 있는 클래스는 정렬이 가능하다는 것을 의미한다.

클래스.sort() 로 배열을 정렬할 때, Comparator를 지정해주지 않으면 저장하는 객체는 주로 Comparable을 구현한 클래스의 객체에 구현된 내용에 따라 정렬된다.

  • Comparable : 기본 정렬기준을 구현하는데 사용
  • Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용

목표 - Monster 클래스의 랭킹을 정하는 코드를 리팩토링 하자

[기존 코드]

기본 정렬기준이 아닌 "Monster의 게임이 끝난 뒤, 최종 전진위치(fowardPosition)"를 기준으로 sort하여 ranking(ArrayList)에 저장하기 위해서 Comparator를 구현하였다.

private void rank() {        
    Comparator<Monster> comparator = Comparator.comparing(Monster::getForwardPosition);
    ranking = monsters.stream().sorted(comparator.reversed()).collect(Collectors.toList());
}


[리팩토링 계획]

현재 Monster 클래스가 정렬돼야 할 기준은 하나이다. forwardPosition(전진위치)가 높은 순서로 정렬을 한다.
Monster 클래스가 Comparable 인터페이스를 구현하도록 설계해보자

  1. Monster 클래스에 Comparable 인터페이스를 implements 한다.
abstract class Monster implements Comparable<Monster> { ... }
  1. Compare 인터페이스를 구현한다고 선언하면 기본적으로 compareTo() 메서드를 구현해줘야 한다.

Monster anotherMonster : compareTo의 매개변수로 비교대상이 될 다른 Monster 객체를 받는다.

비교 기준이 될 Monster의 forwardPosition은 int 형으로, 기존의 Integer 클래스의 compareTo를 이용해서 비교해주도록 하였다.

this.getForwardPosition으로 forwardPostion값을 가져와 Integer로 변환 후, compareTo()에는 매개변수로 받은 다른 Monster의 forwardPosition 값을 넣어주면된다.

@Override
public int compareTo(Monster anotherMonster) {
  return ((Integer) anotherMonster.getForwardPosition()).compareTo((Integer) this.getForwardPosition()); //내림차순 정렬
  return ((Integer) this.getForwardPosition()).compareTo((Integer) anotherMonster.getForwardPosition()); //오름차순 정렬
}

개선된 코드

@Override
public int compareTo(Monster anotherMonster) {
  return Integer.compare(anotherMonster.getForwardPosition(), this.getForwardPosition()); //내림차순
//  return Integer.compare(this.getForwardPosition(), anotherMonster.getForwardPosition()); //오름차순
}

실행결과
몬스터 Racing 결과가 랭킹순으로 출력된다.

참고

JAVA API 문서

Java Comparable interface example

profile
nunnu

0개의 댓글