Set 컬렉션 클래스

김남건·2021년 7월 24일
0
post-thumbnail

Set 컬렉션 클래스

Set 인터페이스를 구현한 클래스로, 요소의 저장 순서를 유지하지 않고, 같은 요소의 중복 저장을 허용하지 않는 것이 특징이다. (null도 하나만 저장 가능하다.) 전체 객체를 대상으로 작업을 하고자 하면 iterator를 사용해야 한다.

Set 인터페이스 메서드

메서드설명
boolean add(E e)주어진 객체를 저장, 성공적으로 저장되면 true, 중복 객체면 false 반환
boolean contains(Object o)주어진 객체가 저장되어 있는지 여부
boolean isEmpty()Set이 비어 있는지
Iterator<E> iterator()저장된 객체를 한 번씩 가져오는 iterator 반환
int size()저장된 객체 수
void clear()저장된 모든 객체 삭제
boolean remove(Object o)해당 객체 삭제

HashSet<E> 클래스

JDK 1.2부터 제공된 클래스로, 해시 알고리즘(hash algorithm)을 이용하기 때문에 검색 속도가 빠르다. 내부적으로는 HashMap 인스턴스를 이용하여 요소를 저장한다.

Set 인터페이스를 구현하므로 요소의 저장 순서를 유지하지 않는데, 저장 순서를 유지해야 하는 경우에는 LinkedHashSet 클래스를 이용하면 된다. (JDK 1.4부터 제공)

중복 확인 방법

hashCode() 반환값이 같고 equals()의 반환값이 true이면 중복으로 간주한다.

해시 알고리즘(hash algorithm)

해시 함수를 사용하여 데이터를 해시 테이블(hash table)에 저장하고 검색하는 알고리즘이다.

자바에서는 배열과 연결 리스트로 구현한다.

저장할 데이터의 키 값을 해시 함수에 넣어 배열의 인덱스를 구하고 해당 인덱스의 연결 리스트에 데이터를 저장한다.

add 과정

  1. 해당 요소의 hashCode() 메서드의 반환값으로 검색 범위를 결정한다.
  2. 해당 범위의 요소들을 equals() 메서드로 비교한다.

개발자의 의도대로 중복되는 요소가 없게 하기 위해서는 hashCode, equals를 알맞게 오버라이딩해야 한다.

class Animal {
    String species;
    String habitat;

    Animal(String species, String habitat) {
        this.species = species;
        this.habitat = habitat;
    }
    
    public int hashCode() { return (species + habitat).hashCode(); }

    public boolean equals(Object obj) {
        if(obj instanceof Animal) {
            Animal temp = (Animal)obj;
            return species.equals(temp.species) &&
            habitat.equals(temp.habitat);
        } else {
            return false;
        }
    }
}

public class Set02 {
    public static void main(String[] args) {
        HashSet<Animal> hs = new HashSet<Animal>();

        hs.add(new Animal("고양이", "육지"));
        hs.add(new Animal("고양이", "육지"));
        hs.add(new Animal("고양이", "육지"));

        System.out.println(hs.size()); // 1
    }
}

TreeSet<E> 클래스

데이터가 정렬된 상태로 저장되는 Binary Search Tree 형태로 요소를 저장하기 때문에, 추가 제거 등의 기본 동작 시간이 빠르다. 이 때문에 Iterator를 통하여 요소에 순서대로 접근하면 정렬된 순서대로 값에 접근할 수 있다.

JDK 1.2 부터 제공되며, NavigableSet 인터페이스를 Red-Black Tree로 구현하였다.

이 클래스 또한 Set 인터페이스를 구현하였기 때문에, 요소의 순서에 상관없이 저장하고 중복된 값은 허용하지 않는다.

예시

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

// add() 메소드를 이용한 요소의 저장
ts.add(30);
ts.add(40);
ts.add(20);
ts.add(10);

// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
for (int e : ts) {
    System.out.print(e + " ");
}

// remove() 메소드를 이용한 요소의 제거
ts.remove(40);
 
// iterator() 메소드를 이용한 요소의 출력
Iterator<Integer> iter = ts.iterator();
while (iter.hasNext()) {
    System.out.print(iter.next() + " ");
}
 
// size() 메소드를 이용한 요소의 총 개수
System.out.println("이진 검색 트리의 크기 : " + ts.size());

// subSet() 메소드를 이용한 부분 집합의 출력System.out.println(ts.subSet(10, 20));System.out.println(ts.subSet(10, true, 20, true));

subSet() 메서드

①번의 경우 첫번째 매개변수 값에 해당하는 요소부터 두번째 매개변수 값에 해당하는 요소 직전까지를 반환한다.
②번의 경우 양 끝의 요소를 포함하는지 아닌지를 명시하여 호출한다.

Reference

http://tcpschool.com/java/java_collectionFramework_set

0개의 댓글

관련 채용 정보