Java

Effective Java 제 3장 - 모든 객체의 공통 메서드

iksadnorth 2023. 8. 22. 23:03

해당 게시물은 책 'Effective Java'를 참고하고 작성했습니다.

Object.equals() 메서드를 재정의할 때, 주의해야 한다!
해당 내용은 2 회독 때, 더 자세히 정리할 계획이다. 내용이 굉장히 많다.

Object.equals()를 재정의하거든 Object.hashCode()도 재정의해라!
HashMap이나 HashSet과 같은 컬렉션을 이용하려면 hashCode()을 재정의해야 한다.

이 때, hashCode()를 재정의할 때 유의할 점이 있는데 마찬가지로 2회독 때, 자세하게 다룬다.
다만 전형적인 hashCode 알고리즘이 있다고 하여 이것을 여기에 적고자 한다.
31은 홀수면서 소수다. 소수를 곱해서 hashCode를 구성하는 이유는 명확하지 않지만 관습적으로 그리 해왔다고 한다.

더보기
class Example {
    int area;
    int prefix;
    int lineNum;
    ...
    
    @override
    public int hashCode() {
        int result = Integer.hashCode(area);
        result = 31 * result + Integer.hashCode(prefix);
        result = 31 * result + Integer.hashCode(lineNum);
        ...
        return result;
    }
}

toString()을 항상 재정의하라!
toString()으로 내부 데이터를 확인할 수 있게 재정의한다면 디버깅이 매우 쉬워진다.

clone() 재정의는 각별한 주의를 요한다!
굉장히 난해한 내용이 많아 역시 2회독으로 미루지만 
결론적으론 Cloneable을 구현해 .clone() 메서드를 사용하는 것보다
차라리 복제 생성자, 복제 팩터리를 이용하는 것이 낫다고 한다.
다만, 배열 깊은 복사는 .clone()이 예외적으로 우수하다고 한다.

Comparable을 구현해라!
순서를 고려해야 하는 경우, 예를 들어 TreeSet, TreeMap과 같은 것의 요소로 사용하고 싶다면
해당 인터페이스를 구현해야 한다.