Object 클래스에서의 equals() 메소드는 ==연산자와 동일한 역할을 한다.
같은 메모리 상에 있는지를 확인하고 동일한 객체라면 true를 아니라면 false를 반환한다.
java.lang.Object.equals(Object obj)
public boolean equals(Object anObject) { return this==obj;
그런데 String 객체를 비교해보면 다른 결과가 나타난다.
test code
public static void main(String[] args){ //String 클래스 String str = new String("test"); System.out.println(str); String str2 = new String("test"); //==와 equals의 비교 System.out.println(str==str2); System.out.println(str.equals(str2)); }
str와 str2는 값은 "test"로 동일하지만 다른 메모리에 있는 다른 객체이다.
그런데 equals메소드를 사용하면 true라는 결과가 반환이 된다.
java.lang.String.equals(Object obj)
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String aString = (String)anObject; if (coder() == aString.coder()) { return isLatin1() ? StringLatin1.equals(value, aString.value) : StringUTF16.equals(value, aString.value); } } return false; }
String 클래스의 equals메소드를 보면 먼저 동일한 객체인지를 확인하고, 만약 다르다면 다른 메모리 상에 있더라도 그 값이 동일한지를 확인하고 있다.
package object;
class Student{
int studentID;
String studentName;
Student(int studentID, String studentName){
this.studentID = studentID;
this.studentName = studentName;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
else if (obj instanceof Student) {
Student aStudent = (Student) obj;
if (this.studentID == aStudent.studentID) {
return true;
}
}
return false;
}
}
public class EqualsTest {
public static void main(String[] args){
int count=0;
Student 김진수 = new Student(1,"김진수");
Student 김진수2 = new Student(1, "김진수");
System.out.println(김진수.equals(김진수2));
System.out.println(김진수 == 김진수2);
}
}
equals 메소드 오버라이딩을 이용
학생1, 2가 있을 때 다른 객체이더라도 학번이 같으면 같은 학생이라고 반환하도록 재정의를 해주었다.
파라미터가 Object타입이기 때문에 Student aStudent에 형변환을 하여 비교를 했다.
+equals()를 재정의하면 hashCode()도 재정의를 해줘야한다
신기하굼헌