IDE를 보면 사진과 같이 equals()와 hashCode()를 함께 오버라이딩하게 되어있는데 equals()와 hashCode()가 도대체 무엇인지, 왜 둘이 함께 묶이는지에 대해 알아보자.
public boolean equelas(Object obj) {
return (this==obj);
}
public class Main {
public static void main(String[] args) {
Test test1 = new Test(1);
Test test2 = new Test(1);
if (test1.equals(test2)) {
System.out.println("test1과 test2는 같습니다.");
} else {
System.out.println("test1과 test2는 다릅니다.");
}
}
}
class Test {
private int value;
public Test(int value) {
this.value = value;
}
}
test1과 test2는 다릅니다.
컴퓨터적인 관점에서보면 서로의 주소가 다르기때문에 서로 다른 객체가 맞다.
서로의 주소가 다르더라도 같은 값을 가지고 있으면 같은 객체로 판단하게 할 수는 없을까?
이때 오버라이딩을 통해서 같은 값을 가지고 있을 경우 같은 객체로 판단하게 할 수 있다.
public class Main {
public static void main(String[] args) {
Test test1 = new Test(1);
Test test2 = new Test(1);
if (test1.equals(test2)) {
System.out.println("test1과 test2는 같습니다.");
} else {
System.out.println("test1과 test2는 다릅니다.");
}
}
}
class Test {
private int value;
public Test(int value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Test) {
return this.value == ((Test)obj).value;
}
return false; // 객체의 타입이 Test가 아니면 값을 비교할 필요 없음.
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test test = (Test) o;
return value == test.value;
}
test1과 test2는 같습니다.
public class Main {
public static void main(String[] args) {
Test test1 = new Test(1);
Test test2 = new Test(1);
System.out.println("test1.hashCode() = " + test1.hashCode());
System.out.println("test2.hashCode() = " + test2.hashCode());
if (test1.equals(test2)) {
System.out.println("test1과 test2는 같습니다.");
} else {
System.out.println("test1과 test2는 다릅니다.");
}
}
}
class Test {
private int value;
public Test(int value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test test = (Test) o;
return value == test.value;
}
/
}
test1.hashCode() = 918221580
test2.hashCode() = 681842940
test1과 test2는 같습니다.
public class Main {
public static void main(String[] args) {
Test test1 = new Test(1);
Test test2 = new Test(1);
System.out.println("test1.hashCode() = " + test1.hashCode());
System.out.println("test2.hashCode() = " + test2.hashCode());
if (test1.equals(test2)) {
System.out.println("test1과 test2는 같습니다.");
} else {
System.out.println("test1과 test2는 다릅니다.");
}
}
}
class Test {
private int value;
public Test(int value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test test = (Test) o;
return value == test.value;
}
@Override
public int hashCode() {
return Objects.hash(value);
}
}
test1.hashCode() = 32
test2.hashCode() = 32
test1과 test2는 같습니다.
이처럼 객체의 값으로 객체의 같고 다름을 판단하는 경우에는 hashCode()도 함께 오버라이딩해야한다.
되도록이면 맨 위 사진처럼 IDE의 자동화를 사용하자.. 실수할 수도 있으니..