JAVA

[Java] Set 자료구조와 Set 인터페이스란?

kimyongjun0129 2025. 4. 14. 22:59

Set 자료구조

중복을 허용하지 않는 자료구조이다.

 


 

Set 인터페이스

  • 중복을 허용하지 않는다. (같은 객체를 두 번 이상 저장할 수 없다.)
  • 순서를 보장하지 않는다. (HashSet의 경우)
  • null 값 저장 가능하다. (단, 하나만)

 

import java.util.Set;

자바 util 패키지에 포함되어 있다.

 

 

1. 객체 생성

Set<String> set = new Set<>();	// ❌ 불가능

Set<String> set = new HashSet<>();	// ✅ 가능
Set<String> set = new LinkedHashSet<>();	// ✅ 가능
Set<String> set = new TreeSet <>();	// ✅ 가능
  • Java에서 제공하는 Set 인터페이스(Set<k>)는 객체를 직접 생성 ❌.
    (추가 정보 확인 : https://kimyongjun0129.tistory.com/98)
  • 따라서 HashSet, LinkedHashSet, TreeSet 등의 구현체(클래스)를 사용해야 한다.
  • 위 코드에서 처럼 작성하는 이유 :
    1. 코드의 유연성 증가 : 필요에 따라 다른 구현체로 쉽게 교체할 수 있다.
    2. 다형성(Polymorphism) 활용 : 구현체에 의지 ❌, 하나의 인터페이스로 여러 가지 구현체를 사용할 수 있다. 

 

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;

다른 구현체(클래스)를 사용할 때는 import를 시켜줘야 한다.

 

 

2. 주요 구현체

클래스 특징
HashSet 가장 일반적인 Set, 해시를 이용해 저장 (순서 없다.)
LinkedHashSet 입력된 순서를 유지
TreeSet 자동으로 정렬 (이진 트리 구조)

 

 

 

3. 주요 공통 메서드들

메서드 설명
add(E e) 요소 추가 (중복이면 false 반환)
remove(Object o) 요소 제거
contains(Object o) 요소 포함 여부 확인
isEmpty() 비어 있는지 확인
size() 요소 개수 반환
clear() 모든 요소 제거
iterator() 반복자(Iterator) 반환, 향상된 for문에 사용 가능
toArray() 배열로 변환

Set의 주요 메서드는 Set 인터페이스에 정의된 것들이라 모든 Set 구현체(HashSet, LinkedHashSet, TreeSet 등)에서 사용 가능 ✅

 

만약, 인터페이스를 통해 구현된 공통 메서드들이 아닌 각 구현체(클래스)의 기능을 사용하고 싶다면

HashSet<String> list = new HashSet<>();

다음과 같이 인터페이스가 아닌 클래스를 이용하여 변수를 선언하고 할당하면 된다.

 

 

4. 사용 예제

더보기
import java.util.Set;
import java.util.HashSet;

public class SetExample {
    public static void main(String[] args) {
        Set<String> fruits = new HashSet<>();

        fruits.add("apple");
        fruits.add("banana");
        fruits.add("orange");
        fruits.add("apple"); // 중복

        System.out.println("Set size: " + fruits.size()); // 3
        System.out.println("Contains banana? " + fruits.contains("banana"));

        for (String fruit : fruits) {
            System.out.println(fruit);
        }

        fruits.remove("banana");
        System.out.println("After removal: " + fruits);

        fruits.clear();
        System.out.println("Is empty? " + fruits.isEmpty());
    }
}