Item10 - equals는 일반 규약을 지켜 재정의하라(4)

2023. 11. 22. 00:23Book/이펙티브 자바

 

적절한 eqauls 메서드 구현 방법

1. == 연산자를 사용해 입력이 자기 자신의 참조인지 확인한다. (반사성)

    => 단순한 성능 최적화용으로, 비교 작업이 복잡한 상황일 때 값어치를 한다.

 

2. instanceof 연산자로 입력이 올바른 타입인지 확인한다.

    => 보통은 자신의 클래스가 아니라면 false를 리턴하지만, 가끔은 그 클래스가 구현한 특정 인터페이스가 될 수도 있다.

 

3. 입력을 올바른 타입으로 형변환한다.

    => 2번을 통과했으니 당연히 된다.

 

4. 입력 객체와 자기 자신의 대응되는 '핵심' 필드들이 모두 일치하는지 하나식 검사한다.

   => 필요 없는 필드는 검사x

 

기본 타입 비교 : ==

  => float, double 제외

  => float와 double은 각각 정적 메서드인 Float.compare(float, float)와 Double.compare(double, double)로 비교

  => Float.equlas와 Double.eqauls로 비교 할 수는 있지만 오토박싱이 수반되므로 성능상 좋지 않음

 

참조 타입 비교 : equals

  => null도 정강 값으로 취급 하는 경우 : Objects.eqauls(Objects, Objects)

 

 

*주의 사항

 - equals 메서드를 재정의 할 때 hashCode도 반드시 재정의하자

 - 너무 복잡하게 해결하지 말자

 - Object가 아닌 타입의 매개변수를 받는 eqauls 메서드는 선언하지 말자(의미 없는 equals가 될 수 있다.)