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

김민우·2023년 1월 7일
0

이펙티브 자바

목록 보기
2/2

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


  • HashCode는 HashMap, HashSet 등을 사용할때 필요한 함수인데, 논리적 동치인 두 클래스에 대해 동일한 해시값이 계산 되어야 한다.(따라서 equals를 재정의 한다면, 무조건 HashCode를 재정의 해야 한다.)

  • 인스턴스의 모든 값에 대해 hashCode() 함수를 재귀적으로 호출하는 것이다.


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


toString은 간결하면서, 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 한다. 이를 위해 모든 클래스에서 toString을 재정의해야 한다.

좋은 toString 작성 방법

  • toString은 그 객체가 가진 주요 정보 모두를 반환하는게 좋음.
  • 주석으로 의도를 명확히 밝혀야 함.
  • toString 외에 객체의 값들을 얻어올 수 있는 API를 제공하자.

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

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로 감싸야한다.

clone 재정의 시 참고사항

  1. clone 메서드는 생성자와 같은 효과를 낸다. clone은 원본 객체에 해를 끼치지 않는 동시에 복제된 객체의 불변식을 보장해야 한다.

clone 방식보다 복사 생성자와 복사 팩토리를 사용해라.

public Redboy(Redboy redboy) { ... }
public static Redboy newInstance(Redboy redboy) { ... }

clone 방식의 단점이었던 언어 모순적, 위험, 허술한 스펙, exception 이 없다.


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

Comparable 인터페이스의 메서드는 compareTo 뿐이다. 클래스가 Comparable을 구현한다면, 클래스의 인스턴스간에 자연적인 순서가 있음을 의미함.
알파벳, 숫자, 연대 같이 순서가 명확한 VO 클래스를 작성한다면 반드시 Comparable을 구현하자.

compareTo의 규약

  • 이 객체와 주어진 객체의 순서를 비교한다.
  • 이 객체가 주어진 객체보다 작으면 음의 정수를, 같으면 0을, 크면 양의 정수를 반환한다.
  • 이 객체와 비교할 수 없는 타입의 객체가 주어지면 ClassCastException을 던진다.
  • 두 객체 참조의 순서를 바꿔서 비교해도 예상한 결과가 나와야 한다.
  • 첫번째 객체가 두번째 객체보다 크고, 두번째 객체가 3번째 객체가 크면, 첫번째 - - 객체는 세번째 객체보다 커야한다.
  • 크기가 같은 객체들 끼리는 어떤 객체와 비교하더라도 항상 같아야 한다.
  • (권장) compareTo의 동치성 결과가 equals와 같아야 한다.

equals와 마찬가지로 반사성, 대칭성, 추이성을 충족해야함!


본 글은 이펙티브 자바 정리를 참고 및 발췌하였으며, 필자의 주관적인 생략이 담겨있음과 동시에 부정확할 수 있습니다.

profile
Backend Developer

0개의 댓글