본문 바로가기
개발/JAVA

@EqualsAndHashCode에 대한 정리

by 설이주인 2023. 9. 21.

@Data를 탐험하다가 @EqualsAndHashCode를 확인했다.

 

Data Annotaion을 확인해보자.

 

See Also를 참고해보면 Getter, Setter, RequiredArgsConstructor은 익숙하니 넘어가고

이번에는 @EqualsAndHashCode을 확인해보고 싶다.

https://projectlombok.org/features/EqualsAndHashCode

 

@EqualsAndHashCode

 

projectlombok.org

정말 영어는 언제나 어렵고

 

제일 위의 설명을 참고하면 Objects를 상속한 fields에 한하여 equals and hashCode methods를 전부 implementation을 진행하겠다는것인데... 우리가 선언하는 아이들은 기본적으로 object가 부모이기에 기본적으로 진행되는 것음을 알겠다.

 

hashcode, equals를 더 살펴보자.

https://www.baeldung.com/java-equals-hashcode-contracts

 

간단하게 요약하면

equals는 비교 대상들이 같은 메모리에 저장되어있어야 equals()가 true를 반환한다.

hashCode()는 실행 중(Runtime)에 객체의 유일한 Inteager 값을 반환한다. 보통 Object 클래스에는 heap에 저장된 객체의 메모리 주소를 반환한다. 즉 객체 내부에 존재하는 값만 다룬다.

 

equals는 결국 2개의 객체가 참조하는 것이 동일한지를 확인하는 것,  2개의 객체가 바라보는 곳이 동일한 메모리 주고일 경우에만 동일한 객체가 된다.

hashCode는 heap에 저장된 객체의 메모리 주소값을 반환한다.

 

equals()를 override를 진행하기 위해서는 hashCode()도 같이 override를 진행해야 한다.

  • 내부 일관성 : hashCode()의 값은 equals()에 존재하는 값이 변경되는 경우에만 변경될 수 있다.
  • 서로 동일한 객체는 동일한 hashCode를 반환 해야 한다.
  • 물론 동일하지 않는 객체가 같은 hashcode를 가질 수 있다
  • Java 프로그램을 실행하는 동안 equals에 사용된 정보가 수정되지 않았다면, hashCode는 항상 동일한 정수값을 반환해야 한다. (Java의 프로그램을 실행할 때 마다 달라지는 것은 상관이 없다.)
  • 두 객체가 equals()에 의해 동일하다면, 두 객체의 hashCode() 값도 일치해야 한다.
  • 두 객체가 equals()에 의해 동일하지 않다면, 두 객체의 hashCode() 값은 일치하지 않아도 된다.

 

예시 코드로 다시 확인해보자.

@Data
public class ExData {
	private String exampleData;
	private int num;
}

@Data
public class ExData2 {
	private String exampleData;
	private int num;
}

public String checkData(ExData data1){
    ExData2 data2 = new ExData2();
    data2.setExampleData("test");
    data2.setNum(10);

    int hashCode1 = data1.hashCode();
    int hashCode2 = data2.hashCode();
    
    System.out.println(hashCode2 == hashCode1); hashCode // true
    System.out.println(hashCode2.equals(hashCode1)); equals // false

    return "done";
}