본문 바로가기
Dev/Java

동일성 (Identity) vs 동등성 (Equality)

by 세대교체 2024. 11. 4.

자바에서 객체를 비교할 땐 동일성과 동등성 개념이 필요하다.

 

동일성 (Identity)

  • 메모리 내 주소가 같은지 비교한다.
  • 자바에서는 == 연산자를 사용하여 동일성 비교한다.

 


동등성 (Equality)

  • 값이 동등한 지 비교한다.
  • 자바에서는 equals() 메서드를 재정의하여 동등성 비교한다.

 

 

자동차 클래스 비교하기

 

Car 클래스는 name과 position 상태를 가진다. 여기서 같은 이름의 자동차는 존재할 수 없다는 요구사항이 있다고 가정하자.

따라서 이름이 같은 두 Car 객체는 동등한 객체로 취급되어야 한다.

 

 

equals() 메서드 재정의

 

  • this == o로 메모리 주소가 같은지 확인한다.
  • o가 null이거나 클래스 타입이 다르면 false를 반환한다.
  • name 필드의 값이 같은지를 비교하여 논리적 동등성을 판단한다.

 

 

 

테스트 코드

 

equals() 메서드를 재정의하지 않으면 테스트가 실패하지만 위에서 equals()를 재정의했으므로 테스트가 통과한다.

 

 

hashCode() 메서드의 중요성

equals()를 재정의할 때는 반드시 hashCode()도 함께 재정의해야 한다. 그 이유는 자바의 컬렉션 프레임워크 중 HashSet, HashMap 등은 객체의 hashCode()를 사용하여 객체를 관리하기 때문이다.

 

 

hashCode() 메서드 재정의

 

name 필드의 값을 사용하여 해시 코드를 생성한다. 이렇게 하면 name이 같은 객체들은 동일한 해시 코드를 가지게 된다.

 

 

Set Collection에서 동등성 확인

 

hashCode()를 재정의하지 않으면 위 테스트는 실패하여 cars.size()가 2가 되지만, hashCode()를 적절히 재정의하면 genesis1과 genesis2는 동등한 객체로 판단되어 HashSet에 하나만 저장된다.

 

 

값 객체나 불변 객체의 동등성은 객체의 상태에 기반하므로, equals()와 hashCode()를 재정의하여 객체의 내용에 따른 올바른 비교를 가능하게 해야 한다.