Student.java
public class Student {
private int studetnNum;
private String studentName;
public Student(int studetnNum, String studentName) {
this.studetnNum = studetnNum;
this.studentName = studentName;
}
public String toString() {
return studetnNum + ","+ studentName;
}
}
EqualTest.java
public class EqualsTest {
public static void main(String[] args) {
Student std1 = new Student(100, "Lee");
Student std2 = new Student(100, "Lee");
System.out.println(std1 == std2);
System.out.println(std1.equals(std2));
}
}
false
falsestd1 과 std2는 다른 주소를 가지고 있는 다른 객체이다.
하지만 논리적으로 학번(studetnNum)의 값이 같으면 같은 학생으로 보는것이 논리적이다.
논리적으로 학번이 같으면 true하고 싶다면!
public class Student {
private int studetnNum;
private String studentName;
public Student(int studetnNum, String studentName) {
this.studetnNum = studetnNum;
this.studentName = studentName;
}
public String toString() {
return studetnNum + ","+ studentName;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Student) { //obj가 Student와 같은 타입이라면
Student std = (Student)obj; // 다운캐스팅 되며,
if(this.studetnNum == std.studetnNum) { // studetnNum과 std.studetnNum가 같은지?
return true;
} else {
return false;
}
}
return false;//obj와 Student가 다르다면 false
}
}
public class EqualsTest {
public static void main(String[] args) {
Student std1 = new Student(100, "Lee");
Student std2 = new Student(100, "Lee");
System.out.println(std1 == std2);
System.out.println(std1.equals(std2));
System.out.println(std1.hashCode());
System.out.println(std2.hashCode());
}
}
false
true
1134712904
985922955주소값은 달라 false로 다르다고 출력되지만,
논리적으로 같다고 재정의 하였기 때문에 true.
Student.java
@Override
public int hashCode() {
return studetnNum; // 학번이 같을때(equals) 같은학번이 반환된다.
}
false
true
100
100주소값은 틀리지만(false),
학번이 논리적으로 같아서(true),
논리적으로 같기때문에 같은 헤시값이 출력되었다.(100, 100)