백_곰 2022. 1. 17. 15:07

1. HashSet의 기본 개념

- Set 인터페이스를 구현한 가장 대표적인 컬렉션이며, 기본적으로 중복된 요소를 저장하지 않고 저장순서

또한 유지하지 않는다.

 

- 만약 중복된 요소를 추가한다면, false를 반환하게 된다.

 

- 만약 저장순서를 유지하고 싶다면, LinkedHashSet을 사용한다.

 

- HashSet 메서드의 상세한 내용은 자바의 정석 631p를 참고한다.

 

 

 

 

1-1. HashSet을 이해하기 위한 예제(1)

: HashSet의 중복을 확인하는 예제이다.

 

 

 

 

 

1-2. HashSet을 이해하기 위한 예제(2)

: 6자리 로또 번호 랜덤 생성하는 예제이다.

 

 

 

 

 

1-3. HashSet을 이해하기 위한 예제(3)

: 6자리 로또 번호 랜덤 생성하는 예제이다.

 

( 정렬 기준은 set에 저장된 Integer 클래스에 정의된 것을 사용한다. )

 

 

 

 

1-4. HashSet을 이해하기 위한 예제(4)

: 5x5의 빙고판을 만드는 예제이다.

 

( 위 코드를 몇번 실행하다보면 계속 똑같은 숫자가 비슷한 위치에 있는 것을 볼 수 있는데, Set 특성상 

저장 순서가 보장되지 않고 자체 방식의 저장 순서를 유지하기 때문이다. )

 

( 그래서 LinkedList를 사용한다. )

 

 

 

 

1-5. HashSet을 이해하기 위한 예제(5)

: Set에 중복된 객체를 저장하고 중복되는지 확인한 후, 중복이 확인될 수 있게 코드를 수정하는 예제이다.

 

( Dav,1의 객체를 중복 추가했음에도 불구하고 똑같은 객체가 중복되었다. )

 

( 이러한 것을 막기 위해서는 프로그래머는 eqauls()hashCode()를 호출하여 목적에 맞게 오버라이딩이 필요하다. )

 

 

( 아래의 코드처럼 Person 클래스에서 오버라이딩이 필요하다. )

 

( 추가적으로 hashCode() 메서드를 오버라이딩할 때 아래의 세 가지 규칙을 지키면서 코딩해야 한다. )

(1) 동일한 객체에 대해서 여러 번 hashCode()를 호출해도 동일한 int 값을 반환해야 한다.

( 실행 시 마다, 동일한 값에 대해 다 다를 수 있음. )

 

(2) equals() 메서드를 이용한 비교에 의해서 true를 얻은 두 객체는 각각 hashCode() 호출를 통한 값은

반드시 같아야 한다.

 

(3) equals() 메서드를 이용한 비교에 의해서 false를 얻은 두 객체는 각각 hashCode() 호출를 통한 값은

같을 수도 있지만, 되도록이면 해싱을 사용하는 컬렉션의 성능을 향상시키기 위해서는 다른 int 값을

반환하는 것이 좋다.

( 만약 중복된 것이 많다면, 컬렉션의 검색속도가 저하된다. )

 

 

 

 

1-6. HashSet을 이해하기 위한 예제(6)

: addAll, retainAll, removeAll을 구현하는 예제이다.

 

( 사실 교집합은 retainAll, 합집합은 addAll, 차집합은 removeAll만 써서 구현해도 된다. )