이펙티브 자바/3장 모든 객체의 공통 메서드 4

아이템 13 clone 재정의는 주의해서 진행하라

자바에서 Object 클래스의 clone() 메서드는 해당 객체를 복제하는데 사용된다. 그러나, Object 클래스의 clone() 메서드는 복제될 객체가 Cloneable 인터페이스를 구현하고 있지 않으면 'CloneNotSupportedException'을 던진다. 즉, 해당 객체가 clone() 메서드를 구현하기 위해서는 Cloneable을 implements 해야한다. 그런데, Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. 왜냐하면, Cloneable은 인터페이스 자체가 메서드를 갖지 않는 마커 인터페이스이기 때문이다. 마커 인터페이스란? 메서드를 갖지 않는 인터페이스로, 해당 인터페이스를 구현한 클래스가 특정한 특성이나 동작을 갖고 있음을 나타낸다. ..

아이템 12 toString을 항상 재정의하라

Object의 기본 toString 메서드는 '클래스_이름@16진수로_표시한_해시코드' (ex: PhoneNumber@adbbd)같은 형식을 반환한다. toString 메서드는 객체를 println, printf, 문자열 연결 연산자(+), assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 불린다. toString은 해당 객체에 관한 명확하고 유용한 정보를 읽기 좋은 형태로 반환해야 한다.

아이템 11 equals를 재정의하려거든 hashCode도 재정의하라

equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. 그렇지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것이다. equals 비교에 사용되는 필드를 고려해서 논리적으로 동일한 객체끼리는 동일한 hashCode를 갖게 구현해야 한다. 전형적인 hashCode 메서드 @Override public int hashCode() { int result = Short.hashCode(areaCode); // 1 result = 31 * result + Short.hashCode(prefix); // 2 result = 31 * result + Short.hashCode(lineNum);..

아이템 10 equals는 일반 규약을 지켜 재정의하라

equals를 재정의 할 필요가 없는 상황 각 인스턴스가 본질적으로 고유하다. Object의 equals 메서드가 그렇다. 인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없다. java.util.regex.Pattern의 equals같이 동일한 정규표현식을 나타내는지 같은 논리적 동일함을 판단할 필요가 없다면 Object의 equals를 그대로 받으면 된다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. Set