-
equals override 시에 주의 점은 무엇인가 (hashCode)전공 지식/JAVA 2022. 2. 18. 01:03
자바의 equal, hashCode 는 모든 object 의 부모 객체인 Object Class 에 정의 되어있다.
그래서 Java 에서 정의하는 모든 객체는 equals, hashCode 를 상속받고 있고 그걸 그대로 보통 사용한다.
하지만 equals 를 오버라이드 하고 싶을땐 어떻게 하지??
우선 equals 에 대해서 알아보자.
- equals 메소드는 두 객체가 동일한지 검사를 하기 위해 사용한다.
동일한지 검사 == 동일한 메모리 주소를 참조하는 것이 맞는지!
*** 여기서 의문점!!
하지만 스트링을 모두 동적할당해서 사용한다면 두 객체는 분명히 메모리 주소가 다를텐데??!
왜 equals 는 TRUE 로 나오는 것인가!
그것은 String 에서 equals 를 Override 해서 그런 것이다!
hashCode 는 그럼 무엇인가
- hashCode 는 RunTime 에 객체의 int key 값이라고 생각하면 된다!
일반적으론 Object 에선 heap 에 저장된 객체의 메모리 주소를 반환!
그래서 equals 을 재정의 할 때, hashCode 를 왜 주의해야하는데?
둘이 무슨 관계인데 그래??!
- equals => 동일한 객체는 동일한 메모리 주소를 갖는다 == 그럼 heap 에 저장된 객체 메모리 주소가 같지 않을까?
=> 그럼 equals true 면 hashCode 값도 같아야겠네!!
명제 : equals TRUE -> HashCode 이 같음 : 참
대우 : HashCode 같지 않음 -> equals 가 같지 않음 : 참
역 : HashCode 가 같음 -> equal True : 거짓
이 : equals False -> HashCode 이 같지 않음 : 거짓
hashCode 는 쓰이는 경우를 못봤는데 언제 쓰이는데??!
- hashSet, hashMap 등은 알 거다.
set 과 map 의 특징이 무엇인지 다들 알겠지만?! => 같은 key 값은 1개만 저장됨!
hashCode 를 통해서 같은 key 인지 확인을 함
그래서 Equals 만 Override 하고 hashCode 를 Override 하지 않으면..
equals 은 true 인데 hashSet 엔 관계 없이 저장 될 수 있음ㅎ
'전공 지식 > JAVA' 카테고리의 다른 글
Java 7 -> 8 로 달라진 부분 (0) 2020.07.29 Interface (0) 2020.07.23 Heap 영역 Detail / Garbage-Collection (0) 2020.07.13 String StringBuilder StringBuffer (0) 2018.12.06 interface 간 상속 및 다중 상속 (0) 2018.12.05 댓글