• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

7강 HashAndEqualsMain3 질문

24.06.24 03:58 작성 24.06.24 04:43 수정 조회수 75

0

안녕하세요,

여러 번 이해하려 해도 기초가 부족해 쉽게 이해되지 않아 질문을 남깁니다 ㅠㅠ

 

// Member 클래스에서 equals() 오버라이딩
Member m1 = new Member("A");
Member m2 = new Member("A");
// m1.equals(m2) = true

HashAndEqualsMain3 수업 중 Member 클래스에서 새로 정의한 equals() 메서드를 통해 참조값이 다른 두 객체 m1.equals(m2) = true 를 알 수 있었습니다.

 

 MyHashSetV2 에서 정의한 add() 메서드에서는 중복을 허용하지 않기 위해 LinkedList.contain() 메서드를 사용해서 안에 들어있는 내용의 동등성을 비교하고 있습니다.

public boolean add(Object value) {
    int hashIndex = hashIndex(value);
    LinkedList<Object> bucket = buckets[hashIndex];
    
    if (bucket.contains(value)) {
        return false;
    bucket.add(value);
    size++;
    return true;
}

 

  1. equals() 를 재정의 하지 않은 MemberOnlyHash 를 이용한 HashAndEqualsMain2 수업에서는 m1 과 m2 가 Objects.equal() 로 다른 참조값을 비교하게 되어 add() 에서 중복을 검증할 수 없었고 MyHashSetV2.add() 를 통과해 같은 인덱스에 중복된 값이 들어가게 되었습니다.

 

  1. HashAndEqualsMain3 수업에서는 equals() 를 재정의한 Member 객체를 쓰고 있는데 m1 을 LinkedList 에 add() 로 추가한 후 m2 를 추가하는 과정에서 LinkedList.contains() 로 중복이 걸러져 m2 는 추가되지 않는것을 확인하게 되었습니다.

 

질문 : equals() 를 재정의 하며 Member 객체끼리 비교는 가능하게 되었는데 어떻게 Member 에서 재정의한 equals() 가 LinkedList.contains() 의 값에 영향을 줄 수 있는지 궁금합니다.

Member 에서만 재정의한 메서드가 이미 LinkedList bucket 에 들어있는 "A" 라는 값과 동등성 검사를 할 때 영향을 끼치는 것 같은데 매개변수의 타입에서 재정의를 하는것이 LinkedList.contains() 에 영향을 미칠 수 있나요?

혹은 영한님이 MyHashSetV2Main2 수업때 언급하신 equals() 사용처에 짧게 나온 아래 코드와 같은 동작 원리일까요?

public boolean contains(Object searchValue) {
    int hashIndex = hashIndex(searchValue);
    LinkedList<Object> bucket = buckets[hashIndex];
    for (Object object : bucket) {
         if (object.equals(searchValue)) {
             return true;
         }
    }
    return false;
}

 

이해가 잘 되지 않아 질문도 뒤죽박죽인듯 해 걱정입니다. ㅠㅠ

잘못 이해한 부분이 있다면 따끔한 지적 부탁드립니다. 항상 강의 잘 보고 있습니다!

답변 1

답변을 작성해보세요.

1

y2gcoder님의 프로필

y2gcoder

2024.06.24

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

원리 자체는 item을 꺼내 비교한다는 점에서 저희가 구현했던 코드와 비슷합니다! 실제로 Intellij IDE가 좋아서 직접 코드를 타고 들어가보시면

image

내부적으로 indexOf()를 사용하고 있습니다!

imageindexOf를 보시면 node들을 차례대로 순회하면서 안의 item을 꺼내와 equals()로 비교하는 것을 보실 수 있습니다.

 

 

감사합니다.

감사합니다! 도움이 되었습니다. 코드 들어가서 다시 정독해서 이해해보도록 하겠습니다!

채널톡 아이콘