먼저 동일비교와 동등비교의 차이점에 대해 알아보자
동일비교
서로의 주소(참조) 값이 같은지 비교하는 방식이다.
주소(참조)가 같기 때문에 가지고 있는 데이터도 같다.
Java에서는 ==
연산자로 주소 값이 같은지 확인한다.
동등비교
서로 가지고 있는 데이터가 같은지 비교하는 방식이다.
주소(참조) 값이 달라도 데이터가 같다면 서로 동일하다고 판단한다.
Java에서는 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
user1
과 user2
의 데이터가 같은데도 비교결과는 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);
}
비교하는 두 객체가
같은 객체인지
확인하는 메서드
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) - 동일객체와 동등객체