HashMap에서 equals 재정의할때 들어가는 Object가 뭔지좀 가르쳐주세요
조회수 104회
java
package sec01.verify.exam03;
public class Student {
private String studentNum;
public Student(String studentNum) {
this.studentNum = studentNum;
}
public String getStudentNum() {
return studentNum;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
Student student = (Student) obj;
if(studentNum.equals(student.getStudentNum())) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return studentNum.hashCode();
}
}
===============================================================
package sec01.verify.exam03;
import java.util.HashMap;
public class StudentExample {
public static void main(String[] args) {
//Student 키로 총점을 저장하는 HashMap 객체 생성
HashMap<Student, String> hashMap = new HashMap<Student, String>();
//new Student("1")의 점수 95를 저장
hashMap.put(new Student("1"), "95");
//new Student("1")로 점수를 읽어옴
String score = hashMap.get(new Student("1"));
System.out.println("1번 학생의 총점: " + score);
}
}
hashMap이 키와 값 한쌍으로 이뤄져있고 키는 중복될수없고 같은 키일경우 이전것은 사라지고 새로만든 키만 남는다는것까진 이해했어요 그리고 사용할경우 해시코드를 먼저 비교하고 equals를 비교한다는것까지요...
여기서 질문입니다. 위 코드에서 @Override public boolean equals(Object obj) 에서 Object obj는 구체적으로 뭐가 들어간건가요? Object는 최상위 클래스이므로 모든클래스가 들어갈수있다고하는데 구체적으로 뭐가들어간건지 모르겠네요
1 답변
-
왜
equals
에Object
가 들어가는지는 Java라는 언어의 설계와도 관련됩니다.Object
equals
는Object
클래스에 정의되어 있는 메서드입니다.Object.equals
는 이름에서 보이듯이this
와 다른 오브젝트가 같은지 다른지 알려줍니다.Object
클래스에 정의되어 있기 때문에, 다른 오브젝트의 자료형도Object
입니다.- 모든
class
는Object
를 상속받습니다. 예를 들어,public class Student
라고 적으면 컴파일러가 이걸public class Student extends Object
로 바꿔 버립니다.
equals
HashMap
안의equals
는Student
와Student
만 비교하면 될 것 같은데,equals(Student student)
가 아니라 굳이equals(Object obj)
을 짜야 하는 이유는 이렇습니다.HashMap
에서equals
를 쓰는 이유는 단순합니다. 위에서 언급했듯이 모든 클래스가 오브젝트이므로, 이 함수는 다시 말해서 모든 클래스에 기본적으로 존재하기 때문입니다. 내가 만든equals
를 한 번 구현해 놓으면 많은 자료구조에서 가져다 쓸 수 있는 디자인이죠.- 그러나
Object.equals
는 구립니다.String
에서==
을 쓰지 않는 이유와 같은 이유로, 두 오브젝트의 값이 아니라 레퍼런스가 같은지만 체크합니다. 그래서Student.equals
를 따로 만들어 줘야 합니다. - 근데
Object
에equals
가 이미 있기 때문에 오버라이드(@Override
)해서 구현해야 합니다. 오버라이드 함수는 부모 클래스의 함수의 선언부를 그대로 따라해야 하기 때문에, 반드시boolean equals(Object obj)
의 형태여야 합니다.
결론
그래서 결론은,
equals
자체에는 말해주신 대로 '아무거나 다 들어갈 수 있다'가 되겠습니다. 이런 이유로equals
안에if (obj instanceof Student)
과 같은 줄이 보이는 건 자주 등장하는 패턴입니다.obj
가 뭔지 모르겠지만,obj instanceof Student
가false
라면 일단this
랑obj
의 자료형이 다르다는 뜻이니false
를 리턴해 주면 되겠습니다. 두 오브젝트의 자료형이 같을 경우에만 두 오브젝트의 값을 비교해 비교 결과를 리턴하면 됩니다.
댓글 입력