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 클래스는 객체와 관련된 유용한 메소드들을 제공하는 유틸 클래스