HashMap에서 equals 재정의할때 들어가는 Object가 뭔지좀 가르쳐주세요

조회수 268회

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 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    equalsObject가 들어가는지는 Java라는 언어의 설계와도 관련됩니다.

    Object

    • equalsObject 클래스에 정의되어 있는 메서드입니다.
    • Object.equals는 이름에서 보이듯이 this와 다른 오브젝트가 같은지 다른지 알려줍니다. Object 클래스에 정의되어 있기 때문에, 다른 오브젝트의 자료형도 Object입니다.
    • 모든 classObject를 상속받습니다. 예를 들어, public class Student라고 적으면 컴파일러가 이걸 public class Student extends Object로 바꿔 버립니다.

    equals

    HashMap 안의 equalsStudentStudent만 비교하면 될 것 같은데, equals(Student student)가 아니라 굳이 equals(Object obj)을 짜야 하는 이유는 이렇습니다.

    • HashMap에서 equals를 쓰는 이유는 단순합니다. 위에서 언급했듯이 모든 클래스가 오브젝트이므로, 이 함수는 다시 말해서 모든 클래스에 기본적으로 존재하기 때문입니다. 내가 만든 equals를 한 번 구현해 놓으면 많은 자료구조에서 가져다 쓸 수 있는 디자인이죠.
    • 그러나 Object.equals는 구립니다. String에서 ==을 쓰지 않는 이유와 같은 이유로, 두 오브젝트의 값이 아니라 레퍼런스가 같은지만 체크합니다. 그래서 Student.equals를 따로 만들어 줘야 합니다.
    • 근데 Objectequals가 이미 있기 때문에 오버라이드(@Override)해서 구현해야 합니다. 오버라이드 함수는 부모 클래스의 함수의 선언부를 그대로 따라해야 하기 때문에, 반드시 boolean equals(Object obj)의 형태여야 합니다.

    결론

    그래서 결론은, equals 자체에는 말해주신 대로 '아무거나 다 들어갈 수 있다'가 되겠습니다. 이런 이유로 equals 안에 if (obj instanceof Student)과 같은 줄이 보이는 건 자주 등장하는 패턴입니다.

    obj가 뭔지 모르겠지만, obj instanceof Studentfalse라면 일단 thisobj의 자료형이 다르다는 뜻이니 false를 리턴해 주면 되겠습니다. 두 오브젝트의 자료형이 같을 경우에만 두 오브젝트의 값을 비교해 비교 결과를 리턴하면 됩니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)