본문 바로가기
Java/기초문법

[Java] 컬렉션 자료구조 - Set 컬렉션

by worldcenter 2024. 9. 16.

컬렉션 프레임워크

 

자바는 널리 알려져 잇는 자료 구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스들을 

java.util 패키지에 포함시켜 놓았습니다. 이를 총칭해서 컬렉션 프레임워크 라고 부릅니다.

 

Interface Interface / Class 특징 구현 클래스
Collection List - 순서를 유지하고 저장
- 중복 저장 가능
ArrayList, Vector, LinkedList
Set - 순서를 유지 X
- 중복 저장 X
HashSet, TreeSet
Queue - 선입선출(First-In-First-Out) LinkedList
Map - 키와 값으로 구성된 엔트리로 저장
- 키는 중복 저장 X
HashMap, Hashtable,
TreeMap, Properties 
Vector - 후입선출(Last-In-First-Out) Stack

 

 

Set 컬렉션

Set 컬렉션은 저장 순서를 유지하지 않고 객체를 중복해서 저장할 수 없기에 하나의 null만 저장할 수 있습니다. Set 컬렉션은 수학의 집합에 비유될 수 있는데 집합은 순서와 상관없고 중복이 허용되지 않기 때문입니다.

즉, 값을 넣은 순서와 찾을 때 순서가 다를 수 있습니다.

 

Set 인터페이스 메서드

기능 메서드 설명
객체 추가 boolean add(E e) 주어진 객체를 성공적으로 저장하면 true를 리턴하고 중복 객체면 false를 리턴
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
isEmpty() 컬렉션이 비어 있는지 조사
Iterator<E> iterator() 저장된 객체를 한 번씩 가져오는 반복자 리턴
int size() 저장되어 있는 전체 객체 수 리턴
객체 삭제 void clear() 저장된 모든 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제

 

 

HashSet 클래스

Set 컬렉션 중에서 가장 많이 사용되는 것이 HashSet 입니다. HashSet은 동일한 객체는 중복 저장하지 않습니다. 여기서 '동일한 객체' 란 '동등 객체'를 말합니다. HashSet은 다른 객체라도 hashCode() 메서드의 리턴 값이 같고, equals() 메서드가 true를 리턴하면 동일한 객체라고 판단하고 중복 저장하지 않습니다.

Set<E> set = new HashSet<E>(); // E에 지정된 타입의 객체만 저장
Set<E> set = new HashSet<>();

 

                                     같음                                        true

hashCode() 리턴값 ----------> equals() 리턴값 ----------> 동등 객체 

             |                                            |   false

             |                                            |

             ---------------------> 다른 객체

                            다름

             

Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메서드는 없습니다. 대신 객체를 한 개 씩 반복해서 가져와야 하는데, 2가지 방법이 있습니다. 

 

1. for문 이용

Set<E> set = new HashSet<>();
for(E e : set) {
  ...
}

 

2. iterator() 메서드 이용

리턴 타입 메서드명 설명
boolean hasNext() 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴
E next() 컬렉션에서 하나의 객체를 가져옵니다.
void remove() next()로 가져온 객체를 Set 컬렉션에서 제거합니다.
Set<E> set = new HashSet<>();
Iterator<E> iterator = set.iterator();

while(iterator.hasNext()) {
  E e = iterator.next();
}

 

 

TreeSet 클래스

TreeSet은 검색 기능을 강화시킨 클래스로 이진 트리를 기반으로 한 Set 컬렉션 입니다. Tree에 객체를 저장하면 다음과 같이 자동으로 정렬(오름차순)됩니다. 부모 노드의 객체와 비교해서 낮은 것은 왼쪽 자식 노드에, 높은 것은 오른쪽 자식 노드에 저장합니다.

출처: https://walbatrossw.github.io/java/2018/02/16/java-basic-20-treeset.html

 

TreeSet<E> treeSet = new TreeSet<E>(); // E에 지정된 타입의 객체만 저장
TreeSet<E> treeSet = new TreeSet<>();

 

Set 타입 변수에 대입해도 되지만 TreeSet 타입으로 대입한 이유는 검색 관련 메소드가 TreeSet에만 저장되어 있기 때문입니다.

리턴 타입 메서드 설명
E first() 제일 낮은 객체를 리턴
E last() 제일 높은 객체를 리턴
E lower(E e) 주어진 객체보다 바로 아래 객체를 리턴
E higher(E e) 주어진 객체보다 바로 위 객체를 리턴
E floor(E e) 주어진 객체와 동등한 객체가 있으면 리턴, 만약 없다면 주어진 객체의 바로 아래의 객체를 리턴
E ceiling(E e) 주어진 객체와 동등한 객체가 있으면 리턴, 만약 없다면 주어진 객체의 바로 위 객체를 리턴
E pollFirst() 제일 낮은 객체를 꺼내오고 컬렉션에서 제거
E pollLast() 제일 높은 객체를 꺼내오고 컬렉션에서 제거
Iterator<E> descendingIterator() 내림차순으로 정렬된 Iterator를 리턴
NavigableSet<E> descendingSet() 내림차순으로 정렬된 NavigableSet을 리턴
NavigableSet headSet(E, true or false) 주어진 객체보다 낮은 객체들을 NavigableSet으로 리턴
주어진 객체 포함 여부는 두 번째 매개 값에 따라 달라짐
NavigableSet tailSet(E, true or false) 주어진 객체보다 높은 객체들을 NavigableSet으로 리턴
주어진 객체 포함 여부는 두 번째 매개 값에 따라 달라짐
NavigableSet subSet(E, true or false, E, true or false) 시작과 끝으로 주어진 객체 사이의 객체들을 NavigableSet으로 리턴
주어진 객체 포함 여부는 두 번째, 네번 째 매개 값에 따라 달라짐