hashCode() 메서드

동치면 반드시 해시값이 같음
- 동치가 아니면 해시값이 거의 다르지만, 같을 수도 있음
- 해시 충돌
Object 클래스 기본 구현
- 주소 기반으로 해시값 구함
- equals() 메서드 기본 동작이 주소값 비교니까
- 동치라면 주소값이 같음

해시 코드가 필요한 클래스에서 각자 알아서 정의하면 되는데, 왜 Object 클래스에 정의해 오버라이딩하고 사용하게 했을까?
HashMap클래스에서 사용하기 위해서hashCode함수를Object에 구현해서 얻은 추가적인 이득- 빠르게 같은 개체인지 확인할 수 있음
equals를 호출해 비교하는 것 보다 빠름- 하지만 두 개체가 다른지는 알 수 없음
- 빠르게 같은 개체인지 확인할 수 있음
해시 충돌
- 해시 코드가 같아도 두 개체가 다를 수 있음
- 두 개체가 같으면 해시 코드는 반드시 같음
equals를 오버라이딩 했다면,hashCode도 반드시 오버라이딩 하자동치의 개념을 반영

String 클래스에서 구현한 hashCode() 를 그대로 사용한 예시
- firstName, lastName 값이 순서만 바뀐 경우 동치로 판단하는 것을 방지하기 위해 비트 시프트
이 hashCode 구현은 equals 바디 안에서 호출해서 사용할 수 있음