Java 입문 | java.util 패키지 - 콜렉션 | Set 인터페이스 및 관련 클래스

Set 인터페이스

Set 인터페이스는 단일 데이터를 저장하는 Collection으로써, 중복된 데이터 저장을 허용하지 않고 순서가 보장되지 않는다. Set에서 새로 선언된 메소드는 없다. List 인터페이스를 구현한 하위 클래스로는 TreeSet, HashSet이 있다.

  • Set
    • SortedSet
    • TreeSet
  • HashSet

SortedSet 인터페이스

Set 인터페이스를 상속 받은 인터페이스로는 SortedSet 인터페이스가 있는데, SortedSet 인터페이스가 있는데, SortedSet 인터페이스에서는 오름 차순으로 정렬하여 데이터를 보관할 수 있다.

SortedSet 메소드

메소드 설명
Comparator<? super E> comparator() SortedSet의 설정된 Comparator(비교기)를 반환한다. 설정한 null이 반환되고 있다면 설정된 Comparator가 반환된다.
E first() SortedSet의 첫번째 객체를 반환한다.
SortedSet<E> headSet(E toElement) toElement 객체보다 작은 객체의 부분으로 구성한 SortedSet 객체를 반환한다.
E last() SortedSet의 마지막 객체를 반환한다.
SortedSet<E> subSet(E fromElement, E toElement) toElement(포함)보다 크고, fromElement(제외)보다 작은 객체로 구성한 SortedSet 객체를 반환하다.
SortedSet<E> tailSet(E fromElement) fromElement(포함)보다 큰 객체로 구성한 SortedSet을 반환한다.

HashSet 클래스

HashSet은 AbstractSet을 확장하고 Set 인터페이스를 구현한다. 저장소에 해시 테이블을 사용하는 Collection을 만든다.

해시 테이블은 해싱(Hashing)이라는 메커니즘을 사용하여 정보를 저장한다. 해시 테이블 저장소는 데이터를 저장하기 위해서 유일하게 구분되는 key 값과 value를 한 세트로 하여 저장하게 된다. 이 때 key 값은 개발자가 부여하는 것이 아니라 코드에서 자동으로 처리된다. 저장된 데이터를 순차적으로 관리하는 것이 아니라 hash code로 구분하여 저장되기 때문에 index를 이용하여 key값에 접근할 수 없다. 해싱에서는 해시 코드라는 고유 한 값을 결정하기 위해 키의 정보 콘텐츠가 사용된다. 해싱을 이용하게 되면 순차적으로 데이터를 관리하는 것보다 많은 양의 데이터를 관리할 때 추가, 삭제, 검색 등에서 속도가 향상된다.

HashSet은 정렬 기능을 지원하지 않기 때문에, 정렬기능을 지원하기 위해서는 SortedSet을 구현한 TreeSet 클래스를 사용하도록 하자.

HashSet 예제

package com.devkuma.tutorial.java.util;

import java.util.HashSet;
import java.util.Set;

public class HashSetClass {

    public static void main(String[] args) {

        Set<Integer> hs = new HashSet<Integer>();

        hs.add(85);
        hs.add(67);
        hs.add(58);
        hs.add(30);
        hs.add(46);

        for (Integer i : hs) {
            System.out.println(i);
        }
    }
}

실행 결과는 아래와 같다.

67
85
58
30
46

TreeSet 클래스

TreeSet은 Set 인터페이스와 SortedSet 인터페이스를 구현한 클래스이다. 정렬 기능을 지원하며, 트리 형태로 데이터를 관리한다. 요소가 저장될 때 오름차순으로 정렬되어 저장되기 때문에 데이터를 얻어 속도가 떨어지지는 않는다.

TreeSet 예제

package com.devkuma.tutorial.java.util;

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

public class TreeSetClass {

    public static void main(String[] args) {

        Set<Integer> ts = new TreeSet<Integer>();

        ts.add(85);
        ts.add(67);
        ts.add(58);
        ts.add(30);
        ts.add(46);

        for (Integer i : ts) {
            System.out.println(i);
        }
    }
}

실행 결과는 아래와 같다.

30
46
58
67
85

이전 HashSet 클래스와는 달리 저장된 데이터를 정렬한 후에 출력해 준다.