IT Study/컴퓨터 기초

[Java] 컬렉션 프레임워크 2 (Set, HashSet 중심으로)

three kim 2023. 3. 28. 13:50
728x90

 

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