그럼 만약에 위 Student 객체에서 hashCode를 재정의 하지 않으면 어떻게 될까?
두 학생 객체가 같은데도 불구하고 중복을 허용하지 않는 HashSet에서 다른 객체로 간주될 수도 있다.
그럼 hashCode를 재정의 하면?
중복된 객체로 잘 처리된다.
HashSet과 같은 Collection들(HashMap, HashTable ...)은 항상 hashCode -> equals 순서로 동등성을 비교한다고 한다.
그래서 결론은? equals와 hashCode는 항상 같이 오버라이딩 하자!
이야기가 살짝 샜긴 한데, 그럼 동일성은 무엇일까?
위 사진에서 봤던 고유한 값을 바탕으로, 즉 두 객체가 메모리상에서 같은 객체인지 비교하는 개념이다.
자바에서는 ==를 사용하여 동일성을 비교하는데, 이때 ==는 객체의 참조를 비교한다.
위와 같이 new로 생성된 student1과 2는 동일하지 않은 객체로 출력되지만 student1을 참조하는 student3은 동일한 객체로 출력된다.
그런데 아래와 같이 이상한 상황이 생길 수 있다.
자바에서 문자열 정의시 동일성 비교를 해도 같다고 나오는 경우가 있다(s1과 s2). 찾아보니 문자열은 문자열 상수 풀(String Constant Pool)에 저장되고 관리되기 때문에 true를 반환할 수 있다고 한다. 하지만 s3와 같이 new를 사용하게 되면 새로운 객체가 생성되므로 무조건 동등성 비교에는 equals 비교를 하는 것이 좋다.
그 외에도 Integer와 같은 래퍼 클래스도 객체이기 때문에 ==는 참조를 비교하므로 동등성 비교에는 equals를 사용해야 한다.