JAVA Set

김개발세발바닥·2024년 4월 1일

JAVA

목록 보기
5/12
post-thumbnail

Set.

Set은 순서에 상관 없이, 어떤 데이터가 존재하는지를 확인하기 위한 용도로 많이 사용된다.
중복되는 것을 방지하고, 원하는 값이 포함되어 있는지를 확인하는 것이 주 용도다.
자바에서 Set 인터페이스를 구현한 주요 클래스는 HashSet, TreeSet, LinkedHashSet이 있다.

HashSet: 순서가 전혀 필요 없는 데이터를 해시 테이블에 저장한다. Set 중에 가장 성능이 좋다.
TreeSet: 저장된 데이터의 값에 따라서 정렬되는 셋. red-black이라는 트리 타입으로 값이 저장되며 HashSet 보다 약간 성능이 느리다.
LinkedHashSet: 연결된 목록 타입으로 구현된 해시 테이블에 데이터를 저장한다. 저장된 순서에 따라서 값이 정렬된다. 대신 성능이 이 셋 중에서 가장 나쁘다.

성능차이가 발생하는 이유는 데이터 정렬 때문이다. HashSet은 별도의 정렬 작업이 없어 제일 빠르다. 하지만 몇백 만 건을 처리하지 않는 이상 그 성능 차이를 체감하기는 힘들다.

HashSet 클래스.

java.lang.Object 
-> java.util.AbstractCollection<E> 
-> java.util.AbstractSet<E> 
-> java.util.HashSet<E>

AbstractCollection을 확장한 것은 ArrayList와 동일하다.
AbstractSet 클래스에 구현되어 있는 메소드는 Object 클래스에 선언되어 있는 equals(), hashCode() 메소드와 이 클래스에서 추가한 removeAll() 뿐이다.
equals()와 hashCode() 메소드를 구현하는 부분은 Set에서 매우 중요하다.

HashSet이 구현한 모든 인터페이스들.

Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>

Set은 순서가 없다. 따라서 get(int index)나 indexOf(Object o)와 같은 메소드들은 존재하지 않는다.

HashSet의 생성자.

  • HashSet() -> 데이터를 저장할 수 있는 16개의 공간과 0.75의 로드팩터를 갖는 객체를 생성한다.
  • HashSet(Collection<? extends E> c) -> 매개 변수로 받은 컬랙션 객체의 데이터를 HashSet에 담는다.
  • HashSet(int initialCapacity) -> 매개 변수로 받은 개수만큼의 데이터 저장 공간과 0.75 로드 팩터를 갖는 객체를 생성한다.
  • HashSet(int initialCapacity, float loadFactor) -> 첫 매개 변수로 받은 개수만큼의 데이터 저장 공간과 두 번째 매개 변수로 받은 만큼의 로드 팩터를 갖는 객체를 생성한다.

로드 팩터.

로드 팩터는 (데이터의 개수)/(저장 공간)을 의미한다.
만약 데이터의 개수가 증가하여 로드 팩터보다 커지면, 저장 공간의 크기는 증가되고 해시 재정리 작업을 해야만 한다.
데이터가 해시 재정리 작업에 들어가면, 내부에 갖고 있는 자료 구조를 다시 생성하는 단계를 거쳐야하므로 성능에 영향이 발생한다.
로드 팩터라는 값이 클수록 공간은 넉넉해지지만, 데이터를 찾는 시간은 증가한다.

저장된 element의 수 == 저장용량 * load factor

즉, 저장용량이 고정돼 있을 때 element를 증가시키면 load factor도 커진다.
커지다가 0.75에 도달(75%가 차게 되면) 하게 되면 저장용량을 약 두배로 늘린다.
이때 저장용량을 늘리는 과정이 애플리케이션에 부하를 많이 주게 된다.
그래서 저장될 데이터(element)의 수가 대충 짐작이 가능하다면
처음에 객체를 생성할 때 저장용량을 데이터 수에 맞게 설정해주는게 좋다.

HashSet의 주요 메소드.

  • add(E e) -> 데이터를 추가한다.
  • clear() -> 모든 데이터를 삭제한다.
  • clone() -> HashSet 객체를 복제한다. 하지만 담겨 있는 데이터들은 복제하지 않는다.
  • contains(Object o) -> 지정한 객체가 존재하는지를 확인한다.
  • isEmpty() -> 데이터가 있는지 확인한다.
  • iterator() -> 데이터를 꺼내기 위한 Iterator 객체를 리턴한다.
  • remove(Object o) -> 매개 변수로 넘어온 객체를 삭제한다.
  • size() -> 데이터의 개수를 리턴한다.

HashSet은 정말 많이 쓰이지만 로드 팩터라는 개념은 모르고 사용했었는데 이번 기회에 확실히 공부해봐야겠다!
레드-블랙 트리도 공부해야겠다..

0개의 댓글