Hash 에 대해서 알아보고 자바에서 hashCode() 와 equals() 메서드를 재정의해야 되는 이유에 대해서 알아보자.
자바에서는 두 객체가 같다는 표현을 2가지로 분리해서 사용한다.
동일성(Identity): == 연산자를 사용하여 물리적으로 두 객체가 같은 메모리에 있는 객체인지 참조 값을 확인
동등성(Equals): equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인
User user1 = new User("A");
User user2 = new User("A");
System.out.println(user1 == user2) // false
System.out.println(user1.equals(user2)) // true
hashCode() 메서드를 재정의하지 않으면, 동일한 데이터를 가진 객체라도 다른 해시 코드가 반환될 수 있어서 데이터 구조에서 중복 문제가 발생할 수 있다.
따라서 같은 데이터에 대해 동일한 해시 코드를 반환하도록 hashCode() 메서드를 재정의해야 한다.
그러나 해시 충돌로 인해 서로 다른 데이터가 같은 해시 버킷에 들어갈 수 있기 때문에 이를 정확히 비교하기 위해 equals() 메서드도 재정의하여 사용해야 한다.