본문 바로가기

언어공부/Java

자바 Set인터페이스, HashSet, TreeSet

자바 Set인터페이스, HashSet, TreeSet에 대해서 알아보자.

Set인터페이스

Set인터페이스는 저장순서가 없는 데이터의 집합. 데이터의 중복을 허용하지 않는다. (예를 들어 양의 정수 집합, 소수의 집합) 구현클래스는 HashSet, TreeSet등이 있다.

 

직사각형은 인터페이스, 원형은 클래스를 나타낸다.

 


HashSet

HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다. 

 

HashSet에 새로운 요소를 추가할 때는 add메소드나 addAll메소드를 사용하는데, 만일 HashSet에 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면 이 메소드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는 것을 알린다. 이러한 HashSet의 특징을 이용하면 컬렉션 내의 중복 요소들을 쉽게 제거할 수 있다.

 

하지만 "1"과 new Integer(1)을 저장한다면 출력할 때 1이 두번 출력되어 중복같이 보이지만, 하나는 String인스턴스이고 다른하나는 Integer인스턴스로 서로 다른 객체이므로 중복으로 간주하지 않는다.

 

ArrayList와 같이 List인터페이스를 구현한 컬렉션과 달리 HashSet은 저장순서를 유지하지 않으므로 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야한다.

 

ex)

 

출력화면

 


TreeSet

TreeSet은 이진 탐색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다. 이진 탐색트리는 정렬, 검색, 범위검색에 높은 성능을 보이는 자료구조이며 TreeSet은 이진 탐색 트리의 성능을 향상시킨 "레드-블랙 트리(Red-Black tree)"로 구현되어 있다.

 

그리고Set인터페이스를 구현했으므로 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장순서를 유지하지도 않는다. 

 

이진탐색트리는 부모노드의 왼쪽에는 부모노드의 값보다 작은 값의 자식노드를 오른쪽에는 큰 값의 자식노드를 저장하는 이진 트리이다. 왼쪽 마지막 값에서 오른쪽 값까지 값을 왼쪽노드 >> 부모노드 >> 오른쪽 노드 순으로 읽어오면 오름차순으로 정렬된 순서를 얻을 수 있다. TreeSet은 이처럼 정렬된 상태를 유지하기 때문에 단일 값 검색과 범위검색(예를 들어 3과 7사이의 범위에 있는 값을 검색)이 매우 빠르다.

 

트리는 데이터를 순차적으로 저장하는 것이 아니라 저장위치를 찾아서 저장해야하고, 삭제하는 경우 트리의 일부를 재구성해야 하므로 LinkedList보다 데이터의 추가/삭제시간은 더 걸리지만 ArrayList나 LinkedList에 비해 검색과 정렬기능이 더 뛰어나다.

 

 

출력화면.

 

출력화면을 보면 저장순서와 관계 없이 오름차순으로 정리 된것을 알 수 있다.