equals()
equals() 는 보통 동일한 객체인지 확인할 때 사용한다.
- 항상 그런 것은 아니고 String 의 경우 문자열이 동일한 지 확인할 때 사용함
// Object의 기본 equals 메서드
public boolean equals(Object obj) {
return (this == obj);
}
hashCode()
- int hashCode()로 정의된 hashCode 메소드는 실행 중에 (Runtime) 객체의 유일한 integer 값을 반환한다.
Object 클래스에서는 heap에 저장된 객체의 메모리 주소를 반환하도록 되어있다. (항상 그런 것은 아니다.) - native 언어로 작성된 메소드로 구체적인 내부 구현부는 확인하기 어렵지만, 객체의 해시 값을 반환한다고 주석에 명시 되어 있음
- HashTable, HashMap, HashSet 등 Hash를 이용하여 데이터를 저장하는 자료구조에 이점을 줌
- 데이터 저장 위치를 결정하는데 사용됨
public native int hashCode();
equals()와 hashCode()의 관계
- 동일한 객체는 동일한 메모리 주소를 갖는다는 것을 의미하므로, 동일한 객체는 동일한 해시 코드를 가져야 한다.
- equals()를 재정의(override)할 때는, hashCode()도 재정의해야 한다. (항상 함께 재정의)
- equals()의 값이 true이면, hashCode()도 동일한 값을 가져야 함
- 반대로 equals() 값이 false이면, hashCode()도 다른 값을 가져야 함
결론
equals()와 hashCode()는 항상 같이 재정의 해야함
객체 비교 (equals() 와 == )
Object 클래스의 equals()는 위와 같은 기능으로서 이 메소드는 비교 연산자인 == 과 동일한 결과를 리턴합니다.
오롯이 참조값 (객체의 주소값)이 같은지, 다시 말하면 동일 객체인지를 확인하는 기능입니다.
자바에서는 두 객체를 동등 비교할 때 equals() 메소드를 흔히 사용합니다.
equals() 메소드는 두 객체를 비교해서 논리적으로 동등하면 true, 그렇지 않으면 false를 리턴합니다.
논리적으로 동등하다는 것은 둘의 참조값이 다르더라도 객체 내부 value는 같다는 것을 의미합니다.
이 equals 함수를 재정의한 대표적인 예가 String class 입니다.
String class는 equals() 메소드를 재정의해서 번지 비교가 아닌 문자열 '값'을 비교합니다.
- 동일성 비교는 == 비교입니다.
객체 인스턴스의 주소 값을 비교합니다.
- primitive data type의 경우 == 를 통해 값 비교가 가능합니다. - 동등성 비교는 equals() 메소드를 사용해서 객체 내부의 값을 비교합니다.
* 참고로 primitive 타입이 == 비교를 통해 값 비교가 가능한 이유는 아래와 같습니다.
변수 선언부는 Java Runtime Date Area의 Stack 영역에 저장이 되고, 해당 변수에 저장된 상수는 Runtime Constant Pool에 저장되어 있습니다.
Stack의 변수 선언부는 해당 Runtime Constant Pool의 주소값을 가지게 되고, 만약 다른 변수도 같은 상수를 저장하고 있다면, 이 다른 변수도 같은 Runtime Constant Pool의 주소값을 가지기 때문에 엄밀히 말하자면 primitive type 역시 주소값 비교가 되는 것입니다.
참고:
https://memostack.tistory.com/232
https://jisooo.tistory.com/entry/java-hashcode%EC%99%80-equals-%EB%A9%94%EC%84%9C%EB%93%9C%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C
https://mangkyu.tistory.com/101
'Back-end > Java' 카테고리의 다른 글
[Java] Wrapper class (0) | 2022.03.07 |
---|---|
[Java] Checked Exception 과Unchecked Exception (0) | 2022.03.07 |
[Java] 자바에서 null을 안전하게 다루는 방법 (0) | 2021.11.21 |
[Java] Mutable 객체와 Immutable 객체의 차이점 (0) | 2021.11.21 |
[Java] 직렬화와 역직렬화 (0) | 2021.11.21 |