728x90
📌 Set <E>
Set은 요소의 중복을 허용하지 않고, 저장 순서를 유지하지 않는 컬렉션이다.
대표적으로 Set을 구현할 클래스에는 HashSet, TreeSet이 있다.
✔️ Set의 메서드
기능 | 리턴 타입 | 메서드 | 설명 |
객체 추가 | boolean | add(Object o) | 주어진 객체를 추가하고, 성공하면 true를, 중복 객체면 false를 반환합니다. |
객체 검색 | boolean | contains(Object o) | 주어진 객체가 Set에 존재하는지 확인합니다. |
boolean | isEmpty() | Set이 비어있는지 확인합니다. | |
Iterator | Iterator() | 저장된 객체를 하나씩 읽어오는 반복자를 리턴합니다. | |
int | size() | 저장되어 있는 전체 객체의 수를 리턴합니다. | |
객체 삭제 | void | clear() | Set에 저장되어져 있는 모든 객체를 삭제합니다. |
boolean | remove(Object o) | 주어진 객체를 삭제합니다. |
📌 HashSet
HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스이다.
따라서 Set 인터페이스의 특성을 그대로 물려받으므로 중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않는다.
- add(Object o)를 통해 객체를 저장하고자 한다.
- 이 때, 저장하고자 하는 객체의 해시코드를 hashCode() 메서드를 통해 얻어낸다.
- Set이 저장하고 있는 모든 객체들의 해시코드를 hashCode() 메서드로 얻어낸다.
- 저장하고자 하는 객체의 해시코드와, Set에 이미 저장되어져 있던 객체들의 해시코드를 비교하여, 같은 해시코드가 있는지 검사한다.
- 이 때, 만약 같은 해시코드를 가진 객체가 존재한다면 저장하고자 했던 객체가 중복 객체로 간주되어 Set에 추가되지 않으며, add(Object o) 메서드가 false를 리턴한다.
- 같은 해시코드를 가진 객체가 존재하지 않는다면, Set에 객체가 추가되며 add(Object o) 메서드가 true를 리턴한다.
- equals() 메서드를 통해 객체를 비교한다.
- true가 리턴된다면 중복 객체로 간주되어 Set에 추가되지 않으며, add(Object o)가 false를 리턴한다.
- false가 리턴된다면 Set에 객체가 추가되며, add(Object o) 메서드가 true를 리턴한다.
📌 TreeSet
TreeSet은 이진 탐색 트리 형태로 데이터를 저장한다.
데이터의 중복 저장을 허용하지 않고 저장 순서를 유지하지 않는 Set 인터페이스의 특징은 그대로 유지된다.
이진 탐색 트리(Binary Search Tree)란 하나의 부모 노드가 최대 두 개의 자식 노드와 연결되는 이진 트리(Binary Tree)의 일종으로, 정렬과 검색에 특화된 자료 구조이다.
최상위 노드를 ‘루트'라고 한다. 위의 그림에서 10이 바로 루트 노드에 해당된다.
이진 탐색 트리는 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징이 있다.
class Node {
Object element; // 객체의 주소값을 저장하는 참조변수다.
Node left; // 왼쪽 자식 노드의 주소값을 저장하는 참조변수다.
Node right; // 오른쪽 자식 노드의 주소값을 저장하는 참조변수다.
}
아래 예시를 살펴보자.
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
// TreeSet 생성
TreeSet<String> workers = 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"));
}
}
출력값을 확인해보면, 요소를 추가하기만 했음에도 불구하고, 자동으로 사전 편찬 순에 따라 오름차순으로 정렬된 것을 확인할 수 있다. 이는 TreeSet의 기본 정렬 방식이 오름차순이기 때문이다.
댓글