개발하는 두더지

[Effective Java 규칙12] Comparable 구현을 고려하라 본문

Java,Android

[Effective Java 규칙12] Comparable 구현을 고려하라

덜지 2018. 9. 14. 17:09

[Effective Java 규칙12] Comparable 구현을 고려하라

Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다.



Comparable 인터페이스에 포함된 유일한 메서드이고, 이를 구현한 클래스는 순서를 가지게 된다. 또한 검색하거나 최대/최소치를 계산하기도 간단하고, 그 컬렉션을 정렬된 상태로 유지하기도 쉽다. 그리고 다양한 제네릭 알고리즘 및 Comparable 인터페이스를 이용하도록 작성된 컬렉션 구현체와도 전부 연동할 수 있다.

만능??


자바 플랫폼 라이브러리에 포함된 거의 모든 값 클래스는 Comparable 인터페이스를 구현한다. 알파벳 순서나 값의 크기, 시간적 선후관계처럼 명확한 순서를 따르는 값 클래스를 구현할 때는 Comparable 인터페이스를 구현할 것을 반드시 고려해야 한다.


물론 여기에도 지켜야할 규약이 존재하지만 수학적으로 순서가 존재하기만 한다면 문제될 것은 없다. 그리고 equals는 다른 클래스 객체에도 적용이 되야 하는데 ( 상속받은 경우 상위/하위 클래스 고려) Comparable은 같은 객체끼리만 비교하면 된다.


그리고 equals처럼 Comparable 인터페이스를 구현한 원래 클래스를 상속하고 필드를 추가하여 확장하는 방식보다는 원래 클래스를 필드로 포함하는 새로운 클래스를 만들어 사용하면 규약들을 지키면서 안전하게, 문제없이 확장할 수 있다.


아래는 Comparable을 구현하여 회원의 이름과 상태를 정렬하는 예제이다

상태를 우선으로 정렬하고 이름은 오름차순으로 정렬한다.

public class Member implements Comparable<Member>{

static enum Status {
NORMAL(1), FRIEND(2), BANNED(3);

private final int order;
Status(int order) {
this.order = order;
}

public int getOrder() {
return this.order;
}
}

private final String name;
private final Status status;
public Member(final String name, final Status status) {
this.name = name;
this.status = status;
}

@Override
public int compareTo(Member member) {
if(this.status.equals(member.status)) {
return this.name.compareTo(member.name);
} else {
return this.status.compareTo(member.status);
}
}

@Override
public String toString() {
return "Member [name=" + name + ", status=" + status + "]";
}
}


public static void main(String[] args) {
Member[] members = {
new Member("abrt", Member.Status.FRIEND),
new Member("dfgh", Member.Status.FRIEND),
new Member("abdf", Member.Status.NORMAL),
new Member("wert", Member.Status.NORMAL),
new Member("zandgh", Member.Status.BANNED),
new Member("qwer", Member.Status.BANNED)
};

List<Member> list = Arrays.asList(members);
Collections.sort(list);
System.out.println(list);
}


결과는 아래와 같다.

[Member [name=abdf, status=NORMAL]

, Member [name=wert, status=NORMAL]

, Member [name=abrt, status=FRIEND]

, Member [name=dfgh, status=FRIEND]

, Member [name=qwer, status=BANNED]

, Member [name=zandgh, status=BANNED]

]




















Comments