Java/개념
equals, hashCode
spring_sunshine
2023. 10. 27. 04:36
equals
public boolean equals(Object obj) {
return (this == obj); // 주소값 비교
}
- 자바의 최상위 클래스인 Object의 메소드
- 인자로 들어온 Object가 같은 객체인지 확인해서 boolean 타입으로 리턴한다.
그렇다면 같은 문자열인지를 비교하는 것이 아니므로, 밑에서 둘이 다른 객체가 출력되어야 할 것 같다.
String str1 = new String("apple");
String str2 = new String("apple");
if (str1.equals(str2)) System.out.println("둘이 같은 객체"); // 출력
else System.out.println("둘이 다른 객체");
System.out.println(str1 == str2) // false (주소값 비교)
- String 클래스는 equals 함수를 재정의해서 둘이 같은 객체여도 true, 같은 문자열이어도 true로 리턴시킨다.
객체의 동등성은 객체 내용이 같은지 비교가 되어야 한다.
void test() {
Point point1 = new Point(1,2);
Point point2 = new Point(1,2);
assertThat(point1).isEqualTo(point2); // Test failed (주소값 비교)
}
반드시 equals를 재정의해서 참조가 아니라 내용을 기준으로 비교하도록 해야한다.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
return x == point.x && y == point.y;
}
assertEquals(point1, point2); // Test passed
다음은 Animal 객체의 name과 age의 값을 기준으로 객체의 동등성 기준을 재정의한 예시이다.
@Override
boolean equals(Object o) {
// 현재 객체와 o의 참조값이 같은지 확인
if (this == o)
return true;
// 형변환 전에는 반드시 instanceOf로 확인함
if (!(o instanceOf Animal))
return false;
// 내용 비교를 위해 Animal 객체로 casting
Animal a = (Animal) o;
// name이 String이므로 equals()로 비교: NullPointerException 발생x
return Object.equals(name, a.name) && age == animal.age;
}
@Override
public int hashCode() {
// name,age 필드의 해시코드를 반환
// 동일한 name,age 필드를 가진 객체는 동일한 해시코드를 반환
return Objects.hash(name,age);
}
hashCode
- Object의 hashCode()는 객체의 주소값을 int로 변환하여 리턴한다.
- equals와 hashCode는 반드시 함께 재정의해야 한다.
- equals, hashCode 모두 iv의 주소를 가지고 판단하기 때문
- 두 객체의 equals의 결과가 true면, 두 객체의 해시코드는 일치해야 한다.
만약 "Animal 객체의 name만 같을 때 같은 객체이다"를 표현하고 싶다면 다음과 같이 재정의할 수 있다.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Animal)) return false;
Animal a = (Animal) o;
return Objects.equals(name, a.name); // name이 같은지만 확인
}
@Override
public int hashCode() {
return Objects.hash(name);
}
- Objects 클래스는 객체와 관련된 유용한 메소드들을 제공하는 유틸 클래스