작성
·
128
0
김영한 멘토님 안녕하세요 강의를 듣다가 질문이 있어서 질문 남깁니다!
HashSet 자료구조를 사용해 객체를 저장할때, HashCode와 equals를 재정의 해야한다고 말씀해 주셨는데요. 정말 멘토님 말대로 재정의 하지 않으면 값이 중복되어서 저장되었습니다. 근데 궁금한것은 HashSet 자료구조이기에 HashCode를 사용하는것은 아는데, 그 이전에 자료구조가 Set의 기반의 자료구조인데 Set은 원래도 중복된 값을 허용하지 않는걸로 알고있습니다. 근데 왜 HashCode를 재정의해야 그때서야 값이 중복되어서 저장되지 않는것인가요? 애초에도 Set 기반의 자료구조인데 말입니다.
답변 2
0
안녕하세요, 인프런 AI 인턴입니다.
ryj0330님의 질문은 HashSet 자료구조에서 hashCode()
와 equals()
를 재정의해야 중복된 값이 저장되지 않는 이유에 대한 것입니다. 이 질문에 답하기 위해, HashSet
의 작동 원리를 이해하는 것이 중요합니다.
HashSet
은 Set
인터페이스를 구현합니다. 이는 중복된 요소를 저장하지 않도록 보장하는 컬렉션입니다. 내부적으로 HashSet
은 HashMap
을 사용하여 요소를 저장합니다. 각 요소가 추가될 때, HashSet
은 그 요소의 hashCode()
메서드를 사용하여 해시 테이블 내의 버킷 위치를 결정합니다. 이후, equals()
메서드를 사용하여 해당 버킷 내에 존재하는 모든 요소와 비교하여 중복 여부를 확인합니다.
hashCode()
가 재정의되어 있지 않다면, 서로 다른 인스턴스는 대부분의 경우 서로 다른 해시 코드를 가지게 되어, 논리적으로 동등한 객체라도 다른 버킷에 위치하게 될 수 있습니다. 이 경우 HashSet
은 두 객체를 동일한 객체로 인식하지 못할 수 있습니다. 따라서 hashCode()
와 equals()
모두를 적절하게 재정의함으로써, 논리적 동등성(logical equality)에 기반한 중복 제거 기능을 정확하게 구현할 수 있습니다.
이와 관련된 유사한 설명과 질문을 “왜 equals를 정의할 때 hashCode도 재정의해줘야하는건가요?”에서 찾을 수 있습니다. 이 링크에서는 hashCode
재정의 없이 equals
만을 재정의했을 때 발생할 수 있는 문제와 HashSet
및 기타 HashMap
기반 컬렉션에서 요소의 동등성을 올바르게 판단하기 위해 왜 두 메서드 모두를 재정의해야 하는지에 대해 자세히 설명하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.