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

ryj0330님의 프로필 이미지
ryj0330

작성한 질문수

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

문제와 풀이2

Hashset 자료구조에 대해서 질문 있습니다!

작성

·

127

0

김영한 멘토님 안녕하세요 강의를 듣다가 질문이 있어서 질문 남깁니다!

HashSet 자료구조를 사용해 객체를 저장할때, HashCode와 equals를 재정의 해야한다고 말씀해 주셨는데요. 정말 멘토님 말대로 재정의 하지 않으면 값이 중복되어서 저장되었습니다. 근데 궁금한것은 HashSet 자료구조이기에 HashCode를 사용하는것은 아는데, 그 이전에 자료구조가 Set의 기반의 자료구조인데 Set은 원래도 중복된 값을 허용하지 않는걸로 알고있습니다. 근데 왜 HashCode를 재정의해야 그때서야 값이 중복되어서 저장되지 않는것인가요? 애초에도 Set 기반의 자료구조인데 말입니다.

답변 2

0

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

Set은 인터페이스이기 때문입니다! 인터페이스는 기본적으로 설계도라고 생각하시면 됩니다! 실제로 설계도에는 여기는 A라는 조건을 가지고 만들어야 한다는 등의 제약 사항이 있을 뿐입니다. 구현체가 이러한 제약 사항을 바탕으로 알아서 구현하는 것이고, HashSet은 HashMap을 기반으로 이를 구현하기 때문에 대상 객체의 hashcode와 equals를 재정의해줘야 합니다 🙂

 

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

ryj0330님의 질문은 HashSet 자료구조에서 hashCode()equals()를 재정의해야 중복된 값이 저장되지 않는 이유에 대한 것입니다. 이 질문에 답하기 위해, HashSet의 작동 원리를 이해하는 것이 중요합니다.

HashSetSet 인터페이스를 구현합니다. 이는 중복된 요소를 저장하지 않도록 보장하는 컬렉션입니다. 내부적으로 HashSetHashMap을 사용하여 요소를 저장합니다. 각 요소가 추가될 때, HashSet은 그 요소의 hashCode() 메서드를 사용하여 해시 테이블 내의 버킷 위치를 결정합니다. 이후, equals() 메서드를 사용하여 해당 버킷 내에 존재하는 모든 요소와 비교하여 중복 여부를 확인합니다.

hashCode()가 재정의되어 있지 않다면, 서로 다른 인스턴스는 대부분의 경우 서로 다른 해시 코드를 가지게 되어, 논리적으로 동등한 객체라도 다른 버킷에 위치하게 될 수 있습니다. 이 경우 HashSet은 두 객체를 동일한 객체로 인식하지 못할 수 있습니다. 따라서 hashCode()equals() 모두를 적절하게 재정의함으로써, 논리적 동등성(logical equality)에 기반한 중복 제거 기능을 정확하게 구현할 수 있습니다.

이와 관련된 유사한 설명과 질문을 “왜 equals를 정의할 때 hashCode도 재정의해줘야하는건가요?”에서 찾을 수 있습니다. 이 링크에서는 hashCode 재정의 없이 equals만을 재정의했을 때 발생할 수 있는 문제와 HashSet 및 기타 HashMap 기반 컬렉션에서 요소의 동등성을 올바르게 판단하기 위해 왜 두 메서드 모두를 재정의해야 하는지에 대해 자세히 설명하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ryj0330님의 프로필 이미지
ryj0330

작성한 질문수

질문하기