equals 메서드와 hashCode 메서드에 대해서 설명해 주세요.
동일성
두 인스턴스가 같은 존재인지 판단하는 것으로,
==연산자로 두 인스턴스의 레퍼런스 변수를 비교한다.
동등성
두 인스턴스가 같은 값으로 평가되는지 확인하는 것으로,
equals()메서드를 오버라이딩해 어떤 조건에서 동등하다고 판단할지 정해줄 수 있다.모든 클래스는
Object를 상속받고,Object클래스에equals()메서드가 있기 때문에 재정의(오버라이딩)가 가능하다.
그렇다면 equals()만 재정의하면 모든 객체의 동등성이 보장이 되는 것일까?
equals()만 재정의하면 hash값을 사용하는 자료구조(HashSet, HashMap, HashTable)에 저장할 시 문제가 될 수 있다.

hashCode 메서드는 객체의 주소 값을 이용해서 해싱(hashing) 기법을 통해 해시 코드를 만든 후 반환한다.
때문에 서로 다른 두 객체는 같은 해시 코드를 가질 수 없고, 해시코드는 객체의 지문 이라고도 한다.
hash값을 사용하는 자료구조는 위와 같은 과정을 거쳐 저장된다.예를 들어 필드의 값이 완전히 같은 두 객체를
HashSet에 저장해서 개발자는 1개가 저장될 것이라고 기대했다.하지만 클래스에서
hashCode()를 오버라이딩 하지 않아Object클래스의hashCode메서드가 사용되었고,equals로 비교도 하기 전에 서로 다른hashCode메서드의 리턴 값으로 인해 다른 객체로 판단되어HashSet에는 2개의 객체가 저장된다.이러한 오류를 방지하기 위해
hashCode메서드도 재정의하여 두 객체의 특정 필드값이 같을 경우 같은 해시코드를 갖게 하도록 할 수 있다.
자바에서 미리 정의된 클래스를 저장할 때는 문제가 되지 않지만, 개발자가 직접 정의한 클래스로 데이터를 저장할 때는 equals와 hashCode를 재정의하여 오류를 방지할 수 있다.
참고
Last updated