HashCode는 HashMap, HashSet 등을 사용할때 필요한 함수인데, 논리적 동치인 두 클래스에 대해 동일한 해시값이 계산 되어야 한다.(따라서 equals를 재정의 한다면, 무조건 HashCode를 재정의 해야 한다.)
인스턴스의 모든 값에 대해 hashCode() 함수를 재귀적으로 호출하는 것이다.
toString은 간결하면서, 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다. 이를 위해 모든 클래스에서 toString을 재정의해야 한다.
좋은 toString 작성 방법
Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 인터페이스이다.
clone 메소드는 Cloneable에 정의된 것이 아니라, Object에 정의되었고 protected이다. Cloneable 인터페이스는 메소드 하나 없지만, clone의 동작 방식을 결정한다.
Cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 객체의 필드들을 하나하나 복사한 객체를 반환하며, 그렇지 않은 클래스의 인스턴스에서 호출하면 CloneNotSupportedException을 던진다.
@Override
protected FirstRedboy clone() {
try {
return (FirstRedboy) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
super.clone()은 checked exception인 CloneNotSupportedException을 던지기 때문에 무조건 try-catch로 감싸야한다.
public Redboy(Redboy redboy) { ... }
public static Redboy newInstance(Redboy redboy) { ... }
clone 방식의 단점이었던 언어 모순적, 위험, 허술한 스펙, exception 이 없다.
Comparable 인터페이스의 메서드는 compareTo 뿐이다. 클래스가 Comparable을 구현한다면, 클래스의 인스턴스간에 자연적인 순서가 있음을 의미함.
알파벳, 숫자, 연대 같이 순서가 명확한 VO 클래스를 작성한다면 반드시 Comparable을 구현하자.
compareTo의 규약
본 글은 이펙티브 자바 정리를 참고 및 발췌하였으며, 필자의 주관적인 생략이 담겨있음과 동시에 부정확할 수 있습니다.