인프런 커뮤니티 질문&답변

권정익님의 프로필 이미지
권정익

작성한 질문수

김영한의 실전 자바 - 중급 2편

섹션 7. onlyHash

작성

·

133

·

수정됨

0

hashCode만 오버라이딩으로 재정의하면 해시코드는 같아지지만, 결국 equals비교 Object의 것을 사용해서 실패하게 된다고 하셨습니다.

그런데 MemberOnlyHash 클래스에서 equals를 재정의를 했다고 가정했을 때, 어떻게 MemberOnlyHash로 갈 수 있는 건가요?

오버라이딩 되어서 우선권을 갖고있는 건 알고있습니다.

이해가 안 가는 부분을 어떻게 말을 해야 할 지 조금 복잡하지만...

 

1번 코드

MyHashSetV2 set = new MyHashSetV2(10);

NoEqualsOnlyHash m1 = new NoEqualsOnlyHash("A");
set.add(m1);
  • 1번 코드에서 set에서 add를 호출합니다.

 

2 코드

public boolean add(Object value) {
    LinkedList<Object> bucket = buckets[hashIndex(value)];
    if (bucket.contains(value)) {
        return false;
    }
  • 그리고 2번 코드에 들어가게 되고

 

3번 코드



public boolean add(MemberOnlyHash m1) {
    LinkedList<Object> bucket = buckets[0];

    if (bucket.contains(m1)) {
        return false;
    }
  • 그러면 2번 코드가 실행되면 3번 코드처럼 되는 거라고 이해하고 있습니다. (hashIndex는 편의상 0이라고 하겠습니다.)

     

  • 0번 인덱스에 있는 LinkedList <Object> 타입의 연결리스트가 나옵니다.

 

  • 다음으로 if문으로 들어갑니다. 그리고 LinkedList <Object> 타입의 연결리스트(bucket)가(이) m1을 포함하는지 contains 메서드를 통해서 확인합니다.

 

  • 여기서 질문입니다.

  • 질문 1 :

     

    MemberOnlyHash 타입의 m1과 비교를 하는데 bucket은 여전히 Object타입입니다.

     

     

    (Object)bucket이 contains를 사용하는데 bucket은 MemberOnlyHash 클래스가 오버라이딩 한 것을 어떻게 알고 찾아가는지 이해가 되지 않습니다.

답변 2

1

안녕하세요. 권정익님, 공식 서포터즈 y2gcoder입니다.

제가 질문을 제대로 이해한 것인지 모르겠습니다!

나름대로 요약해보면

Object 타입으로 찾아온 LinkedList<Object> bucket 의 contains() 에서 내부적으로 equals()를 사용한다고 한다. LinkedList 의 각 원소를 다 Object 타입인데 어떻게 MemberOnlyHash 타입에서 오버라이딩한 equals() 를 사용하느냐?

라고 질문해주신 것으로 이해했습니다!

저는 자바 기본편중급 1편을 보시면 해당 질문에 대한 답변을 얻을 수 있다고 생각합니다!

image

먼저 자바 기본편의 챕터 10. 다형성1 에서 설명하는 메서드 오버라이딩입니다. 이를 보시면 부모타입에서 정의한 기능을 자식 타입에서 재정의했을 때, 오버라이딩된 메서드가 우선권을 가지게 됩니다.

위의 그림에서 Parent를 Object, Child를 MemberOnlyHash 인스턴스 로 각각 보시면 좀 더 이해가 쉬우실 거라 생각합니다.

또한 중급 1편의 챕터 1. Object 클래스의 toString()을 오버라이드하는 부분도 다시 복습해주시면 감사하겠습니다!

image

 

 

감사합니다.

0

혹시 이 부분 이해하셨을까요??

권정익님의 프로필 이미지
권정익

작성한 질문수

질문하기