equals
는 보통 값을 비교하고 hashcode
는 hash값을 비교하는 것으로 알고 있을 것이다.
그러면 아래 코드의 결과는 어떻게 나올까?
public class Test {
public static void main(String[] args) {
Person person1 = new Person(1,"A");
Person person2 = new Person(1,"A");
System.out.println("==비교") ;
System.out.println(person1 == person2);
System.out.println("equals비교" );
System.out.println(person1.equals(person2));
}
static class Person {
public int age;
public String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
}
결과는 아래와 같이 둘 다 false이다.
🤔Equals
는 값 비교라고 했는데 위와 같은 결과가 나온 이유는 뭐지???
그러면 이번에는 String
으로 비교를 해보면
public class Test3 {
public static void main(String[] args) {
String a1 = new String("abc");
String a2 = new String("abc");
System.out.println("==비교") ;
System.out.println(a1 == a2);
System.out.println("equals비교" );
System.out.println(a1.equals(a2));
}
}
위와 같은 결과가 나온 이유는 직접 String
객체를 들어가면 알 수 있다.
위와 같이 재정의를 통해서 ==으로 주소가 달라도 값이 같으면 true를 반환하도록 되어 있다.
🤔그러면 처음에 보았던 equals
를 다시 재정의 해보면 값이 어떻게 나올까?
static class Person {
public int age;
public String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}
}
이제는 우리가 생각한대로 결과가 나왔다.
😊우리가 알고 있는 많은(거의 대부분의)객체들은 equals
를 재정의하여 사용하고 있는데 이를 통해 값이 같다면 true를 반환하도록 설계되어 있다.