# 아이템14 Comparable을 구현할지 고려하라

compareTo는 `단순 동치성 비교`에 더해 `순서`까지 비교할 수 있으며 제내릭하다. Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 `자연적인 순서`가 있음을 뜻한다.

## compareTo 규약을 자세히 살펴보자.

* 첫 번째 규약은 두 객체 참조의 순서를 바꿔 비교해도 예상한 결과가 나와야 한다는 얘기다.
* 두 번째 규약은 첫번째가 두 번째보다 크고 두 번째가 세 번째보다 크면, 첫 번째는 세 번째보다 커야 한다는 뜻이다.
* 마지막 규약은 크기가 같은 객체들끼리는 어떤 객체와 비교하더라도 항상 같아야 한다는 뜻이다.

Comparable을 구현한 클래스를 `확장`해 값 컴포넌트를 추가하고 싶다면, 확장하는 대신 `독립된 클래스`를 만들고, 이 클래스에 원래 클래스의 인스턴스를 가리키는 필드를 두자.

마지막 규약은 간단히 말하면 `compareTo` 메서드로 수행한 동치성 테스트의 결과가 `equals`와 같아야 한다는 것이다.

`그 이유는 정렬된 컬렉션들은 동치성을 비교할 때 equals 대신 compareTo를 사용하기 때문이다.`

compareTo 메서드는 각 필드가 동치인지를 비교하는 게 아니라 그 순서를 비교한다. Comparable을 구현하지 않은 필드나 표준이 아닌 순서로 비교해야 한다면 Comparator를 대신 사용한다.

클래스에 핵심 필드가 여러 개라면 어느 것을 먼저 비교하느냐가 중요해진다. 가장 핵심적인 필드부터 비교해나가자
