요구사항.
-HashSetExample2에서 아래와 같은 내용을 출력하고 싶다.
Member 클래스에 equals와 hashCode재정의를 해줌으로써,
HashSetExample2의 추가된 set 객체들은 중복이 제거된다.
HashSetExample2에서는 제네릭에 Member를 명시했습니다. 8행, Set<Member> set = new HashSet<Member>();
Member 클래스에 필드와 생성자를 만들어주고 equals메소드와 hashCode메소드를 재정의 해줬습니다.
HashSetExample2에서 set에 3개의 내용을 추가해주고 객체 수, 내용을 출력했습니다.
하단 콘솔창에서 확인하실 수 있듯이, set내용은 중복이 제거됐습니다.
다음 위 예제에서 Member클래스에 재정의된 equals와 hashCode를 지운 후, 같은 내용을 출력했습니다.
equals메소드만 재정의 했을때의 모습입니다.
객체수 3개, 출력 결과물은 중복된 내용이 나옵니다.
같은 section에있던 HashSetExample1을 보겠습니다.
이 클래스에서는 equals나 hashCode 메소드에 대해 재정의 하지 않았음에도
set안에 들어갈 내용들 중 중복된 것들은 자연스럽게 제거됩니다.
HashSetExample1과 2의 차이 중 하나는 제네릭에 명시된 내용입니다.
example1에서는 java lang 패키지에 String타입으로 명시했고
example2에서는 우리가 만든 Member 클래스로 타입을 명시했습니다.
equals와 hashCode는 java. lang패키지에 String클래스에 속해있는 메소드들 입니다.
따라서 우리가 Member클래스를 만들어,
Set에 <Member>클래스 타입을 명시했을 때에는 중복을 제거하기 위해 두 메소드들을 재정의 해줘야 합니다.
질문으로 돌아가
다시한번 중복된 내용을 출력해보겠습니다.
Member클래스에 equals와 hashCode를 재정의 하지 않았음에도 불구하고 중복된 내용은 출력되지 않을 뿐더러 값이 섞여져 나옵니다.
그러게요 재정의를 안하면 될줄 알았는데 뭐가 문제일까요...
• Iterators allow the caller to remove elements from theunderlying collection during the iteration with well-definedsemantics.
• Method names have been improved.
• 반복기를 사용하면 호출자가 잘 정의 된 의미로 반복하는 동안 기본 컬렉션에서 요소를 제거 할 수 있습니다.
• 메서드 이름이 개선되었습니다.
Interface Iterator를 사용하면 컬렉션 내용을 거른답니다.
답을 못찾은 내용은
아무개 40
홍길동 10
다른내용을 set.add해도 Iterator를 사용하면 출력이 이상하게 된다는 점입니다.
반복문을 사용해보겠습니다.
[결론]
-임의의 객체를 생성하여 제네릭 타입을 명시 할 경우,
Set 중복 제거를 위해서 equals, hashCode를 재정의 해줘야 합니다.
-Iterator는 기본 컬렉션에서 요소를 제거 할 수 있습니다.
'Computer Language > Java & Kotlin' 카테고리의 다른 글
참조변수의 형변환 (0) | 2022.03.25 |
---|---|
22.01.27 Java printf(%d, %s, %f, %c, %n, %b) 정리 (0) | 2022.01.27 |