[Java] 컬렉션 프레임워크 2 (Set, HashSet 중심으로)
1. Set 인터페이스란?
Set은 중복된 원소를 허용하지 않는 자료구조를 구현하는 데에 사용합니다.
Set은 수학의 '집합' 개념과 유사합니다.
수학에서의 집합은 중복되지 않는 원소들의 모임이며, 집합 내 원소들은 순서가 존재하지 않습니다.
Set도 마찬가지로 중복되는 원소를 허용하지 않고 유일해야 하며, 순서에 상관없이 저장됩니다.
따라서, 집합의 개념을 떠올리며 Set의 메서드에 대해 이해해 봅시다.
2. HashSet 클래스
HashSet은 Set 인터페이스 중 가장 일반적으로 사용되는 클래스로, 원소의 순서를 보장하지 않습니다.
2-1. HashSet 사용법
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
HashSet<String> hashset = new HashSet<String>();
}
}
HashSet 클래스를 사용하기 위해서는 해당 클래스를 먼저 import 해야 합니다.
이후 HashSet 클래스는 생성자를 호출하여 객체를 생성할 수 있는데,
2-1-1. Set 인터페이스의 변수에 HashSet 클래스 객체 생성
Set<String> set = new HashSet<String>();
이 방법으로 생성된 set 변수는 HashSet 클래스에서 정의한 메서드를 사용할 수 없습니다.
즉, HashSet 클래스에서 추가된 메서드를 사용하려면 형 변환이 필요합니다.
그러나 코드의 유연성을 고려할 때에는 유용한 방법입니다.
2-1-2. HashSet 클래스의 변수에 HashSet 클래스 객체 생성
HashSet<String> hashset = new HashSet<String>();
이 방법으로 생성된 hashset 변수는 HashSet 클래스에서 정의한 메서드를 그대로 사용할 수 있습니다.
따라서 HashSet 클래스에서 추가된 메서드를 사용하려면 HashSet 클래스의 변수에 객체를 생성하는 것이 좋습니다.
2-2. HashSet 클래스의 메서드
Collection 인터페이스에 존재하는 메서드를 모두 사용할 수 있습니다.
그 외 HashSet 클래스에 추가된 메서드는 아래와 같습니다.
이름 | 매개변수 | 기능 | 반환타입 |
clone() | - | HashSet의 복제한 새로운 HashSet 생성 | Object, 복제된 객체 |
spliterator() | - | HashSet의 요소를 분할할 반복자(iterator) 생성 | Spliterator<T> |
hashCode() | - | HashSet의 해시 코드 반환 | int, 해시 코드 |
toString() | - | HashSet의 문자열 표현 반환 | String |
2-2-1. Object clone()
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
HashSet<String> clonedSet = (HashSet<String>) set.clone();
System.out.println(clonedSet); // [orange, banana, apple]
2-2-2. Spliterator <T> spliterator()
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
Spliterator<String> spliterator = set.spliterator();
while (spliterator.tryAdvance(System.out::println)) {}
// apple
// orange
// banana
2-2-3. int hashCode()
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
System.out.println(set.hashCode()); // 1879631498
2-2-4. String toString()
HashSet<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("orange");
System.out.println(set.toString()); // [orange, banana, apple]
3. TreeSet 클래스
TreeSet은 이진 검색 트리 구조를 기반으로 한 클래스로, 요소 저장 시 자동으로 정렬되어 순서를 보장합니다.
TreeSet의 가장 큰 특징은 데이터 삽입 시 자동으로 오름차순으로 정렬된다는 것입니다.
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
TreeSet<Integer> num = new TreeSet<>();
// 데이터 추가
num.add(5);
num.add(2);
num.add(7);
num.add(1);
// 데이터 출력
System.out.println("TreeSet: " + num); // [1, 2, 5, 7]
}
}
4. LinkedHashSet 클래스
LinkedHashSet은 HashSet와 거의 동일하지만, 요소의 저장 순서를 유지합니다.
LinkedHashSet 클래스의 주요 메서드는 HashSet과 동일하므로, 위의 표와 아래 글의 표를 참고해 주세요!
[Java] 컬렉션 프레임워크 1 (컬렉션 인터페이스)
오늘은 (수업시간에) 컬렉션 프레임워크에 대해 배웠습니다. 자바에서 많이 사용하는 만큼 개념을 정확히 잡고 가야 할 것 같아, 블로그 글로 정리하고자 합니다. 1. 컬렉션 프레임워크란? 다수
1-three.tistory.com