티스토리 뷰
객체 비교시 왜 equals()와 hashcode() 둘 모두를 재정의해야 하는가?
saedong 2023. 5. 24. 13:21객체비교는 그 객체가 VO(Value Object)일 때 한다.
VO에서의 필드값과 해쉬코드값을 동등성과 동일성을 비교해줄 때 오버라이딩해서 사용한다.
동등성 : 객체가 주소값이 다르더라도 내용(필드값)이 같다면 같다고 보는 것 ex) equals(0
동일성 : 객체가 주소값이 다르면 아무리 같은 내용이더라도 같지 않다고 보는것. ex) ==
즉 VO 비교를 위해서는 값만 비교하면 되기에 원래 equals() 기능(Object의 equals()는 동일성 비교를 한다.)을 재정의해줘야 한다.
equals() 메서드는 값, 주소값 모두 비교한다(==와 동일)
Object 클래스의 원래 equals()는 아래와 같은 기능으로써 == 와 동일한 결과를 리턴한다.
// Object의 기본 원래 equals 메서드
public boolean equals(Object obj) {
return (this == obj);
}
equals() 메서드(String에서) 재정의된 것
자바에서 두 객체(VO)의 동등성(객체 필드값이 같은지)을 비교할 때는 equals() 메서드를 사용합니다. equals() 메서드는 두 객체를 비교하여 논리적으로 동등하면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
이때, 논리적으로 비교하는 것은 두 객체의 주소값이 아니라 객체 내부의 값을 비교하는 것을 의미합니다.
String 클래스는 equals()를 재정의하여 주소값 비교가 아닌 문자열의 값만을 비교하도록 구현되어 있습니다.
(주소값을 비교하는 건 == 연산자를 많이 쓴다.)
public class MainTest {
public static void main(String[] args) {
Student s1 = new Student("dsg", 24);
Student s2 = new Student("dsg", 24);
System.out.println("s1.equals(s2) = " + s1.equals(s2));
System.out.println("s1.hashCode() = " + s1.hashCode());
System.out.println("s2.hashCode() = " + s2.hashCode());
}
}
결과
s1.equals(s2) = true
s1.hashCode() = 1975012498
s2.hashCode() = 1808253012
이처럼 재정의한 equals(0는 true를 리턴해준다. 하지만 s1과 s2의 hashCode() 반환값이 다르기 때문에 같은 객체라고 보기 힘들다.
그래서 hashCode()를 재정의 해줘야 하는 것이다.
hashCode란??
hashCode란 객체를 식별하는 하나의 고유 정수값을 말한다.
hashCode()는 객체의 메모리 번지를 이용해서 hashCode를 만들어 반환하기 때문에 객체마다 고유의 다른 값을 가져야 한다.
결론
객체의 비교는 값이 같은지를 비교해야 하며, 그러기 위해선 그 객체의 필드까지 동등한 지 봐야 하기 때문에 equals(), hashCode() 모두 재정의해주어야 한다.
참고
'Java > 주니어 자바 개발자를 위한 100가지 질문' 카테고리의 다른 글
[Java] List, Set, Map 의 특징과 차이 (0) | 2023.06.12 |
---|---|
[Java] 일반 클래스와 추상 클래스의 차이는?? (0) | 2023.06.05 |
[Java] 자바(Java)에서 final의 의미, 기능 (0) | 2023.05.25 |
[JAVA] ==와 equals의 차이 (0) | 2023.05.23 |
JDK와 JRE의 차이점은?? (0) | 2023.05.22 |