Effective Java 3/E - (3) 모든 객체의 공통 메소드

신복호·2020년 12월 6일
0

Effactive JAVA 3/E

목록 보기
3/12
post-thumbnail

3장 모든 객체의 공통 메소드

아이템 10. equals는 일반 규칙을 지켜 재정의해라

  • 재정의 하지 않아도 되는 사항

    • 각 인스턴스가 본질적으로 고유하다. (동작하는 개체를 표현하는 클래스)

      • EX) Thread / Object 클래스의 equals 사용등
    • 인스턴스의 논리적 동치성을 검사할일이 없다.

    • 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어 맞는다.

    • 클래스가 private이거나 package-private이고 equals 메서드를 호출할일이 없다.

  • 재정의를 해야할 상황

    • equlas 메소드는 '메모리 주소를 기반으로 물리적으로 같은가? ' 가 아니라 논리적 동치성을 비교를 해야 할때

    • Map의 키, Set의 원소 등으로 사용하려면 재정의해야 한다.

  • 동치 관계란?

    수학에서, 동치관계(同値關係, 영어: equivalence relation)는 논리적 동치와 비슷한 성질들을 만족시키는 이항관계이다.

    x,y,z는 null이 아니라고 전제한다.

    • 반사성 : 객체는 자기 자신과 같다. x = x
    • 대칭성 : 두 객체는 서로에 대한 동치 여부에 똑같은 결과를 낸다. x = y, y = x
    • 추이성 : 첫번째 객체와 두번째 객체가 같고, 두번째 객체와 세번째 객체가 같으면, 첫번째 객체와 세번째 객체도 같다. x = y, y = z => x = z
    • 일관성 : 두 객체가 같다면 앞으로도 같다.
    • Not null : null이 아닌 모든 참조 값 x에 대해서 x.equals(null) == false.
  • 좋은 equals 재정의

    • == 연산자를 사용해 자기 자신의 참조인지 확인해라

    • instanceof 연산자로 입력이 올바른 타입인지 확인해라, null 검사도 해준다.

    • 입력을 올바른 타입으로 형변환해라

    • 입력 객체와 자기 자신의 대응되는 핵심 필드들이 모두 일치하는지 하나씩 검사해라

    • 성능을 위해 다를 가능성이 크거나, 비용이 싼 필드 먼저 비교해라

필요한 경우가 아니라면 equals를 재정의하지 말자

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

  • equals 메서드를 재정의 했지만 hashcode를 재정의 하지 않는 경우 컬랙션의 원소로 사용될 때 이슈가 있을 수 있다. 따라서 hashCode 규약에 따라 올바르게 재정의 해야한다.

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

  • toString 메서드는 간결하고 읽기 쉬운 형태의 유익한 정보를 반환해야 한다.
    이를 잘 구현하는 클래스는 사용하기 좋고 디버깅을 쉽게 해준다.

  • 좋은 toString 재정의 방법

    • 객체가 가진 주요 정보들을 모두 반환해야 한다.

    • 주석으로 toString이 반환하는 포맷을 명시하든 아니든 의도를 명확하게 해야한다.

    • toString이 반환한 값에 포함된 정보를 얻어올 수 있는 API를 제공하자

  • toString 재정의가 필요없는 경우

    • 대부분의 정적 유틸리티 클래서

    • 대부분의 열거 타입

    • 슈퍼 클래스에서 이미 적절하게 재정의한 경우

  • 실무에서는 ToStringBulider을 추천

public String toString(Object object) {
	return EqualsBuilder.reflectionEquals(this, object);

}

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

Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 인터페이스이다.그러나 Clone 메소드가 선언된것은 Object 클래스 이며 그 마저도 protected로 지정되어 있다.

  • clone보다는 복사 생성자와 복사 팩터리를 사용하자.
//복사 생성자
public User (User user){
	// ...
}

//복사 팩토리
public static User newInstance(User user){
	//...
}

배열을 제외하고 복제 기능은 생성자와 팩터리를 이용하는 것이 좋다.

아이템 14. comparable을 구현할지 고려해라(수정진행중)

Comparable 인터페이스 메소드는 CompareTo이다.

  • 순서를 고려해야 하는 값 클래스를 작성한다면 Comparable 인터페이스를 구현하자
profile
한참 열정이 가득한 백엔드 개발자입니다.

0개의 댓글