[자료구조] 중복을 싫어하는 Set

지니·2025년 2월 27일

자료구조

목록 보기
4/9
post-thumbnail

1. Set이란?


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

  • 만약에 null이 저장되더라도 하나의 null만 저장된다.
  • Set에는 TreeSet, HashSet, LinkedHashSet이 있다.

2. Set의 종류


2-1. HashSet

해시 테이블을 이용해 데이터를 저장하는 구조로, 중복된 값이 저장되지 않는다. HashSet은 순서는 관리하지 않는다.

📌 HashSet과 관련된 더 자세한 내용
https://velog.io/@dbwls89173/JAVA-%EC%A4%91%EB%B3%B5%EC%9D%84-%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94-HashSet

2-2. LinkedHashSet

LinkedHashSet은 HashSet처럼 중복 데이터를 저장하지 않는 특징이 있다.
다만, LinkedHashSet은 데이터를 삽입한 순서대로 출력된다

📌 LinkedHashSet 선언 및 활용

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {

        LinkedHashSet<String> lhset = new LinkedHashSet<>();
        lhset.add("java");
        lhset.add("mysql");
        lhset.add("jdbc");
        lhset.add("html");
        lhset.add("css");
        lhset.add("java");

        System.out.println("lhset : " + lhset);
        // lhset : [java, mysql, jdbc, html, css]
    }
}

2-3. TreeSet

TreeSet은 HashSet처럼 중복 데이터를 저장하지 않고 저장 순서를 유지하지 않는 특징이 있다. 다만, 정렬을 수행한다는 특징이 있다.

📌 TreeSet 선언 및 활용

import java.util.Set;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
    	// TreeSet의 default 정렬은 오름차순이다. 
        TreeSet<String> tset = new TreeSet<>();
        tset.add("java");
        tset.add("mysql");
        tset.add("jdbc");
        tset.add("html");
        tset.add("css");
        tset.add("java");

        System.out.println("tset : " + tset);
        // tset : [css, html, java, jdbc, mysql]
    }
}

3. Set의 데이터를 순회하는 방식


그렇다면 Set에 있는 데이터를 가져와서 활용하는 방식은 무엇이 있을까?! 위에서 작성한 hset 데이터를 순회하는 코드를 살펴보자.

3-1. 배열로 변경하기

// toArray() 메소드를 이용해 배열로 변경한다.
Object[] arr = hset.toArray();
// 배열의 인덱스를 이용해 데이터를 가져온다. 
for(int i = 0; i < arr.length; i++) {
	System.out.println(i + " : " + arr[i]);
}

3-2. Iterable의 iterator 메소드

Iterator<String> iter = hset.iterator();

while(iter.hasNext()) {
	System.out.println(iter.next());
    // 순회하면서 제거가 가능하다. 
    iter.remove();
}
  • Iterator : 컬렉션에 저장되어 있는 요소를 순회하는 인터페이스

    • hashNext() : 다음 요소가 있는지 판단
    • next() : 다음 요소 가져오기
    • remove() : 가져온 요소를 삭제
  • 밑에서는 위에서 설명한 모든 메소드를 사용해 요소 값을 판단하고, 가져온 다음에 요소를 삭제하는 것을 구현한 것이다.

  • hset.iterator();는 Iterator 객체를 반환하는 메서드다.

3-3. 향상된 for문

for(String str : hset) {
	System.out.println(str);
}
  • 향상된 for문에서는 주의할 점이 있다.
  • 만약 반복 순회 중에 remove메소드를 사용하면 ConcurrentModificationException이 발생하니 주의해야 한다.
  • 이 예외는 Set외에도 컬렉션에서 볼 수 있는 예외이다.
    예를 들어, Queue를 순회하고 있을 때 poll()을 사용하는 경우 같은 예외가 발생한한다.

4. Set 정리


  • 각각의 종류에 따라 특징을 정리한 부분이다.
Set 종류중복 허용데이터 순서
HashSetX순서가 없음
LinkedHashSetX삽입한 순서
TreeSetX정렬 순서
  • 상황에 맞게 set을 선택해서 사용하면 된다.

0개의 댓글