본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] Comparable 인터페이스의 구현을 고려하자.

by 돼지왕 왕돼지 2016. 10. 14.
반응형

[Effective Java] Comparable 인터페이스의 구현을 고려하자.


0, arrays, arrays.sort, classcastexception, collection, Collections, Comparable, compareTo, Effective JAVA, equals, Interface, NullPointerException, sort, TreeMap, TreeSet, [Effective Java] Comparable 인터페이스의 구현을 고려하자., 가독성, 가장 우선, 값 클래스, 날짜 순, 동일, 비교, 성능, 순서, 숫자 순, 알파벳 순, 양수, 양수 정수, 양의 정수, 여러 개, 음수, 음의 정수, 자바 라이브러리, 자연율, 정렬, 정수, 제네릭 타입, 차례대로 비교, 차이점, 타입 변환, 타입 확인, 필드


-
compareTo 메소드는 Comparable 인터페이스에 존재하는 메소드이다.
compareTo 메소드는 equals 메소드와 유사한 특성을 갖는다.
차이점은 두 객체가 동일한지 비교에 덧붙여 순서까지 비교할 수 있으며, 제네릭 타입을 지원한다.


-
Comparable interface 를 구현하면, Arrays.sort 와 같은 메소드를 손쉽게 쓸 수 있고,
TreeSet 과 같은 크기 비교를 사용하는 Collection 들에서도 손쉽게 사용할 수 있다.


-
자바 라이브러리의 모든 값 클래스들은 Comparable 인터페이스를 구현한다.


-
알파벳 순, 숫자 순, 날짜 순과 같은 자연율을 갖는 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현해야 한다.


-
compareTo 메소드의 보편적 계약은 equals 와 비슷하다.
단, 순서판단하여 현재 객체의 값이 지정 객체의 값보다 작으면 음수 정수, 같으면 0, 크면 양수 정수 값을 반환한다.
비교할 수 없는 타입이면 ClassCastException 예외를 발생시킨다.


-
compareTo 계약 조항을 따르는 클래스에는, 저장 객체를 정렬 상태로 유지하는 컬렉션인 TreeSet, TreeMap 이 포함되며, 검색과 정렬 알고리즘을 갖고 있는 Collections 와 Arrays 유틸리티 클래스도 포함된다.


-
compareTo 메소드의 작성 방법은 equals 메소드와 유사하지만 몇 가지 중요한 차이가 있다.
compareTo 메소드의 인자로 전달되는 비교 객체의 타입은 컴파일 시점에서 미리 결정 된다. 따라서 compareTo 메소드 내부에서 비교 객체의 타입을 확인하거나 타입 변환을 할 필요가 없다.
만일 인자가 null 이면 가능한 빨리 NullPointerException 예외를 발생시켜야 한다.


-
비교할 필드가 여러 개인 클래스의 경우에는 비교하는 순서가 중요하다.
가장 우선되는 필드부터 시작해서 차례대로 비교해야 한다.


-
다음과 같은 형태의 코드가 가독성도 높고, 성능도 좋다.

// 해당 필드가 음수일 경우를 주의해서 사용해야 한다.

// 더 일반적으로 해당 필드의 최저값과 최고값의 차이가 MIN_VALUE 나 MAX_VALUE 보다 작거나 같아야 한다.

public int compareTo( PhoneNumber pn ){

int areaCodeDiff = areaCode - pn.areaCode;

if ( areCodeDiff != 0 )

return areaCodeDiff;


int prefixDiff = prefix - pn.prefix;

if ( prefixDiff != 0 )

return prefixDiff;


return lineNumber - pn.lineNumber;

}





반응형

댓글