Language/Java

[Java] Set 정리

pongic 2022. 9. 25. 00:43
반응형

Set이란?

Set은 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는 컬렉션이다.

대표적인 Set 클래스에는 HashSet, TreeSet이 있다.

이외에 LinkedHashSet이 있는데 다른 Set과는 다르게 입력 순서를 보장해준다.

 

Set 인터페이스 정의된 메서드

add(Object o)

주어진 객체를 추가하고, 성공하면 true를 중복 객체면 false를 리턴한다. boolean 타입을 리턴한다.

 

contains(Object o)

주어진 객체가 Set에 존재하는지 확인한다. boolean 타입을 리턴한다.

 

isEmpty()

Set이 비어있는지 확인한다. boolean 타입을 리턴한다.

 

iterator()

저장된 객체를 하나씩 읽어오는 반복자를 리턴한다. Iterator 타입을 리턴한다.

 

size()

저장되어 있는 전체 객체의 수를 리턴합니다. int 타입을 리턴한다.


clear()

Set에 저장되어 있는 모든 객체를 삭제합니다.


remove(Object o)

주어진 객체를 삭제합니다. boolean 타입을 리턴한다.

 

 

HashSet

Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스이다. Set 인터페이스의 특성을 그대로 물려받으므로 중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않는다.

 

HashSet 예제

// HashSet 생성
HashSet<String > example = new HashSet<String>();

// HashSet에 객체 추가
example.add("Java");
example.add("Python");
example.add("C++");
example.add("Ruby");
example.add("Java");  // 위에 5번 코드와 중복

// 반복자 생성하여 it에 할당
Iterator it = example.iterator();

// 반복자를 통해 HashSet을 순회하여 각 요소들을 출력
while(it.hasNext()) {
	System.out.println(it.next());
}

/* 출력
Python
Java
Ruby
C++
*/

입력한 순서대로 출력되지 않고, Java를 두 번 추가했지만 한 번만 저장된 것을 확인할 수 있다.

 

 

TreeSet

이진 탐색 트리 형태로 데이터를 저장한다. 데이터의 중복 저장을 허용하지 않고 저장 순서를 유지하지 않는 Set 인터페이스의 특징을 그대로 유지한다.

 

이진 탐색 트리(Binary Search Tree)란 하나의 부모 노드가 최대 두 개의 자식 노드와 연결되는 이진 트리의 일종으로, 정렬과 검색에 특화된 자료 구조이다. 이때 최상위 노드를 루트라고 한다.

 

이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있다.

위 그림의 각 노드들은 아래 Node 클래스를 인스턴스화한 인스턴스에 해당한다.

class Node {
	Object element; // 객체의 주소값을 저장하는 참조변수이다.
	Node left;      // 왼쪽 자식 노드의 주소값을 저장하는 참조변수이다.
	Node right;     // 오른쪽 자식 노드의 주소값을 저장하는 참조변수이다.
}

 

TreeSet 메서드

first()

정렬된 순서에서 첫번째 객체를 반환한다. Object 타입을 리턴한다.

 

last()

정렬된 순서에서 마지막 객체를 반환한다. Object 타입을 리턴한다.

 

higher(Object o)

지정된 객체중에서 큰 값중 제일 가까운값 반환한다. 없으면 null Object 타입을 리턴한다.

 

lower(Object o)

지정된 객체중에서 작은값중 제일 가까운값 반환한다. 없으면 null Object 타입을 리턴한다.

 

subSet(Object fromElement, Object toElement) 

fromElement부터 toElement까지의 객체들을 반환한다. toElement는 미포함한다. SortedSet 타입을 리턴한다.

 

 

TreeSet 예제

// TreeSet 생성
TreeSet<String> example = new TreeSet<>();

// TreeSet에 요소 추가
workers.add("Lee Java");
workers.add("Park Hacker");
workers.add("Kim Coding");

System.out.println(workers);
System.out.println(workers.first());
System.out.println(workers.last());
System.out.println(workers.higher("Lee"));
System.out.println(workers.subSet("Kim", "Park"));

/* 출력
[Kim Coding, Lee Java, Park Hacker]
Kim Coding
Park Hacker
Lee Java
[Kim Coding, Lee Java]
*/

자동으로 사전 편찬 순에 따라 오름차순으로 정렬된 것을 확인할 수 있다. 이는 TreeSet의 기본 정렬 방식이 오름차순이기 때문이다.

반응형