equals(), hashCode()

stoph·2022년 9월 9일
0

먼저 동일비교와 동등비교의 차이점에 대해 알아보자

동일비교
서로의 주소(참조) 값이 같은지 비교하는 방식이다.
주소(참조)가 같기 때문에 가지고 있는 데이터도 같다.
Java에서는 == 연산자로 주소 값이 같은지 확인한다.

동등비교
서로 가지고 있는 데이터가 같은지 비교하는 방식이다.
주소(참조) 값이 달라도 데이터가 같다면 서로 동일하다고 판단한다.
Java에서는 equals() 메서드로 서로 동일한지 확인한다.

equals()

비교하는 두 객체의 내용이 같은지 확인하는 메서드

public class User {
	private String name;
	private String age;

	public User(String name, String age) {
		this.name = name;
		this.age = age;
	}
}
User user1 = new User("user1", "30");
User user2 = new User("user1", "30");

System.out.println(user1.equals(user2));  // false

user1user2 의 데이터가 같은데도 비교결과는 false가 반환되었다.


왜 그런지에 대해서는 Object 클래스의 equals() 가 어떻게 구현되어있는지 보면 알 수 있다.

public boolean equals(Object obj) {
	return (this == obj);
}

서로가 동일한 객체인지 판단하는 동일비교를 구현하고 있다.
user1 == user2 를 하는 것과 같다.

하지만 우리가 equals() 를 쓰는 목적은 동등한지 비교하는 것이다.
그러면 어떻게 동등한지 비교를 할 수 있을까?


equals() 를 적절하게 오버라이딩 하면 된다.

@Override
public boolean equals(Object obj) {
	if (this == obj) {
    	return true;	//주소 값이 같은 경우 true 반환
    }
    
    if (obj == null || this.getClass() != obj.getClass() {
    	return false;	//주소 값이 null이거나 타입이 다른 경우 false 반환
    }
    
    User user = (User) obj;
    
    //가지고 있는 데이터가 같은지 확인
    return this.name.eqauls(user.name) && this.age == user.age);
}

hashCode()

비교하는 두 객체가 같은 객체인지 확인하는 메서드

Hash를 사용하는 자료구조인 HashMap, HashSet 등은 서로 같은 객체라면 같은 Key를 가져야 하는데 이를 위해서는 hashCode()를 오버라이딩 해야한다.

기본적으로 Object 객체에서는 hashCode 를 객체의 주소값을 해시 함수를 통해 변환하여 생성한다.

즉, 주소 값이 같으면 같은 hashCode 를 가지게 된다.

@Override
public int hashCode() {
	return Objects.hash(name, age);
}

해시 함수를 직접 구현할 수도 있지만 Objects 객체의 hash() 함수를 이용하면 간편하게 작성할 수 있다.


결론

동등 비교를 위해 equals() 를 오버라이딩 해야 할 때는 hashCode() 또한 오버라이딩 해주도록 하자.


참고

느리더라도 꾸준하게 - [Java] hashCode() vs equals()
Nesoy Blog - Java equals()와 hashCode()에 대해
네이버 블로그(senshig) - 동일객체와 동등객체

0개의 댓글