본문 바로가기

Java/이펙티브 자바

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

Object에서 final이 아닌 메소드(equals, hashCode, toString, clone, finalize)는 모두 재정의를 염두에 두고 설계되었다. 이 메소드들을 잘못 구현하면 대상 클래스가 일반적인 규약을 준수한다고 가정하고 만들어진 클래스(HashMap, HashSet 등)에서 오동작이 일어날 수 있다.

equals는 일반 규약을 지켜 재정의하라

equals 는 일반 규약을 지켜 재정의 해야한다.

 

재정의 하지 않는 상황

  • VO 가 아니라 일반 클래스인 경우
  • VO 여도 두개 이상 만들어지지 않는 다는게 보장되는 상황, 싱글톤 등 

재정의 하는 상황

  • 논리적 동치성을 비교할 떄 사용하면 좋다 , 객체가 같은지가 중요한게 아니라 객체 안에 있는 값이 같은게 중요할때

equals를 재정의하려거든 hashCode도 재정의하라.

equals 가 두 객체를 같다고 판단 하면 두 객체의 hashCode 는 똑같은 값을 반환해야한다.

equals 가 두 객체를 다르다고 판단하면 hashCode 는 같아도 되지만 달라야 성능이 더 좋다

 

따라서 equals 를 재정의한 클래스에서는 hashCode 도 재정의 해야한다.

toString을 항상 재정의하라

toString 을 재정의 하면 디버깅이 쉬워지기도 한다.

 

toString 은 객체가 가지고 있는 모든 정보를 보여주는게 좋다

 

 

clone 재정의는 주의해서 진행하라

복제 기능은 복사 생성자나 복사 팩토리를 이용하는게 좋다

 

Comparable을 구현할지 고려하라

Comparable 의 인터페이스 메소드는 compateTo 밖에 없다.

sort 기능 구현시 사용한다