TIL 230615

전선웅·2023년 6월 15일
0

TIL

목록 보기
7/12

무엇을 배웠나

  • 프로그래머스 코딩테스트 레벨0 문제풀기
  • java.base module

확장학습

내장 메서드 hashcode()와 equals()로 확인하는 객체 동등성 판단

hashCode()와 equals()는 Java에서 Object 클래스에 속한 메서드들로, 객체를 비교하거나 데이터 구조에 저장하기 위해 사용되는 메서드들이다.

'hashCode()' 메서드는 객체의 메모리 주소를 정수 형태로 반환한다. 이 메서드를 통해 반환되는 값은 Hash-based 컬렉션(예: HashMap, HashSet 등)에서 해당 객체의 위치를 찾는 데 사용된다. 이 메서드를 재정의하면, 개발자는 동일한 객체에 대해 항상 동일한 해시 코드를 반환하도록 할 수 있다. 따라서 같은 객체라면 동일한 hashCode를 반환하도록 재정의하는 것이 중요하다.

'equals()' 메서드는 두 객체가 같은지 그 여부를 판단한다. 기본적으로 equals()는 두 객체의 메모리 주소를 비교한다. 따라서 두 객체가 동일한 메모리 위치에 있을 때만 true를 반환한다. 하지만 개발자는 이 메서드를 재정의해서 두 객체의 속성이나 상태를 비교하도록 할 수 있다. 따라서 일반적으로 equals()는 두 객체가 논리적으로 동일한지 확인하는 데 사용된다.

같은 객체에 대해 equals() 메서드가 true를 반환하면, 해당 객체들의 hashCode() 메서드 역시 동일한 값을 반환해야 한다.그러나, 반대로, 두 객체의 hashCode()가 같다고 해서 항상 equals() 결과가 true임을 증명하지 않는다. 이는 해시 충돌 때문에 발생하는데, 서로 다른 객체가 동일한 해시코드를 가질 수 있기 때문다. 이 경우, equals() 메서드를 사용하여 실제 객체가 같은지 여부를 확인해야 한다.

그렇다고 'equals()'만 사용하는 것이 권장되지는 않는다. 일반적으로 객체가 동일한지 확인할 때는 equals() 메서드를 사용하며, 이는 대부분의 상황에서 충분하다. 그러나 데이터 구조에서 객체의 검색이나 그룹화 등의 작업을 수행할 때는 hashCode() 메서드가 중요한 역할을 한다.

예를 들어, Java의 해시 기반 컬렉션 클래스(HashMap, HashSet 등)는 객체를 저장하고 검색하는 데에 hashCode()를 사용한다. 이러한 컬렉션들은 먼저 hashCode()를 호출하여 해당 객체가 저장될 버킷(bucket)을 결정한다. 해시 충돌이 발생하면 그 버킷 내에서 equals()를 사용하여 올바른 객체를 찾는다.

따라서 equals()와 hashCode()는 서로 보완적인 역할을 하며, 객체 동등성의 적절한 판단을 위해 둘 다 재정의하는 것이 좋다. equals()를 재정의하였다면, 동일한 객체는 반드시 동일한 해시 코드를 반환하도록 hashCode()도 재정의해야 한다. 그렇지 않으면 해시 기반의 컬렉션에서 예상하지 못한 동작이 발생할 수 있다.

profile
꿈 많고, 꿈 크고, 꿈 좋은

0개의 댓글