Set collection

Hyeonsu Bang·2021년 9월 30일
0

Java Basic

목록 보기
4/11
post-thumbnail
public Interface Set<E>
extends Collection<E>

Set

List, Map과 함께 대표적인 Java 인터페이스이다. List와 함께 Collection interface를 상속하는 인터페이스다. 집합이라는 의미이고, 수학에서 쓰이는 용어와 같은 뜻을 가지고 있다.

Set의 특징

Set 인터페이스의 가장 큰 특징은 List 인터페이스와 달리 unordered이다. 따라서 인덱스를 관리하지 않기 때문에 값을 저장하고 값을 불러올 때 순서를 고려하지 않는다. 또한 duplicate를 허용하지 않는다. 같은 데이터가 입력되었을 때 중복저장하지 않는다. null은 최대 하나만 입력을 허용한다.

Index가 관리되지 않기 때문에 set을 검색하게 될 경우 Iterator 인터페이스를 주로 활용한다. 활용은 다른 collection interface와 동일하다.

Set<String> set = new HashSet<>();
set.add("des bonbons");
set.add("le chocolat");
...
Iterator<String> itr = set.iterator();
while(itr.hasNext()){
	String str = itr.next();
}

또는 for each를 통해 iteration하면 된다

for(String str : set){
	syso(str);
}

주의할 것은 Iterator 인터페이스의 remove()를 사용했을 때 실제 set에서 데이터가 지워진다는 점이다.

while(itr.hasNext()){
	String str = itr.next();
    if(str.equals("des bonbons")){
    	itr.remove(); // set에서 삭제
    }
}

물론 set에도 remove()가 있어서 특정 인자를 넣게 되면 해당 인자에 해당하는 데이터가 지워지게 된다.

HashSet

Set 인터페이스의 가장 대표적인 구현 클래스이다. HashTable, 정확히는 HashMap을 기반으로 한 클래스이다. 따라서 bucket, capacity와 같은 개념들이 그대로 적용된다.

참고: HashMap

HashMap과 마찬가지로 데이터를 저장할 때 hashCode()로 hash code를 얻어내고, 이를 토대로 이미 저장되어 있는 데이터의 hash code를 비교한다. 만약 새로 저장하려는 값의 hash code가 이미 존재하고 있으면 equals()로 두 값을 비교하고, 같은 값이면 저장하지 않는다. 개발자가 지정한 DTO의 경우 이 두 메서드를 overriding하여 다른 인스턴스여도 같은 값을 가진 객체이면 중복 저장하지 못하게 하는 이유이다. 역시 HashMap의 자료를 참고하면 이해가 될 것이다.

hash code로 값을 저장, 접근하기 때문에 add(), remove(), contains(), size()에 대해서는 시간 복잡도가 상수값을 갖는다.

HashMap에서처럼 capacity의 threshold에 다다르게 되면 doubling 한 뒤 rehashing되므로, iteration 성능이 중요한 요소일 경우 capacity를 높게 설정해주는 것이 좋을 수 있다.

또한 동기화처리가 내부적으로 되어있지 않기 때문에 multi-thread 환경에서 set에 대해 구조적인 변동이 발생했을 때 값이 제대로 저장되지 않는 경우가 발생한다. 보통 Collection.synchronizeSet()와 같이 "wrap" 해주면 된다.


TL;DR

  • non-dulplicate
  • unordered
  • null은 하나만 허용
  • HashSet은 HashMap에 기반

references:

https://www.baeldung.com/java-hashset

https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html

https://docs.oracle.com/javase/8/docs/api/java/util/Set.html

신용권, 『이것이 자바다』, 한빛미디어

profile
chop chop. mish mash. 재밌게 개발하고 있습니다.

0개의 댓글