Set 컬렉션 클래스

윤재열·2022년 1월 22일
1

Java

목록 보기
41/71

Set컬렉션 클래스

  • Set컬렉션의 특징
  1. 요소의 저장 순서를 유지하지 않습니다.

  2. 같은 요소의 중복 저장을 허용하지 않습니다.

    Set컬렉션 기능 메서드

  • 객체 추가
    -boolean add(E e) : 주어진 객체를 저장합니다.객체가 성공적으로 저장되면true를 리턴,중복된 객체면 false를 리턴
  • 객체 검색
    -boolean cantain(Object o) : 주어진 객체가 저장되어 있는가? 조사
    -boolean isEmpty() : 컬렉션이 비어있는가? 조사
    -Iterator iterator() : 저장된 객체를 한 번씩 가져오는 반복자를 리턴합니다.
    -int size() : 컬렉션의 있는 전체 객체 수를 리턴합니다.
  • 객체 삭제
    -void clear() : 컬렉션에 있는 전체 객체를 삭제합니다.
    -boolean remove(Object o) : 주어진 객체를 삭제합니다.

Set컬렉션의 특징

  • Set컬렉션은 인덱스로 객체를 검색해서 가져오는 메서드가 없습니다.
    대신,전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(iterator)를 제공한다.
  • 반복자는 Iterator인터페이스를 구현한 객체를 말하는데,iterator()메서드를 호출하면 얻을 수 있습니다.
Set<String> set =...;
Iteratro<String>iterator =set.iterator();
  • Iterator타입의 iterator변수에 대입한 이유는 반복해서 가져올 객체가 String타입이기 때문입니다.
리턴타입메서드설명
booleanhasNext()가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴합니다.
Enext()컬렉션에서 하나의 객체를 가져옵니다.
voidremove()Set컬렉션에서 객체를 제거합니다.
Set<String>set =...;
Iterator<String>iterator =set.iterator();
while(iterator.hasNext()){
String str = iterator.next();
}
  • Iterator를 사용하지 않더라도 향상된 for문을 사용하여 전체 객체를 대상으로 반복할 수 있습니다.
Set<String> set =...;
for(String str : set){
}
  • Set컬렉션에서 Iterator의 next() 메서드로 가져온 객체를 제거하고 싶다면 remove() 메서드를 호출하면 됩니다. Iterator의 메서드지만, 실제 Set컬렉션에서 객체가 제거됨을 알아야합니다.

    다음예제는 Set컬렉션에서 "홍길동"을 제거합니다.

while(iterator.hasNext()){
String str = iterator.next();
  if(str.equals("홍길동"){
  iterator.remove();
  }
  }

HashSet

HashSet은 Set인터페이스의 구현 클래스입니다.

Set<E> set = new HashSet<E>();

타입 파라미터 E에는 컬렉션에 저장할 객체 타입을 지정하면 됩니다. 예를 들어 String객체를 저장하는 HashSet은 다음과 같이 생성할 수 있습니다.

Set<String> set = new HashSet<String>();
SET<String> set = new HashSet<>();

HashSet은 객체들을 순서없이 저장하고 동일한 객체는 중복 저장하지 않습니다.

  • HashSet은 객체를 저장하기 전에 먼저 HashCode() 메서드를 호출해서 해시코드를 얻어내고, 이미 저장되어 있는 객체들의 해시코드와 비교합니다.만약, 동일한 해시코드가 있다면 다시 equals()메서드로 두 객체를 비교하여 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다.
HashSet<String> hs01 = new HashSet<String>();

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

 

// add() 메소드를 이용한 요소의 저장

hs01.add("홍길동");

hs01.add("이순신");

System.out.println(hs01.add("임꺽정"));

System.out.println(hs01.add("임꺽정")); // 중복된 요소의 저장

 

// Enhanced for 문과 get() 메소드를 이용한 요소의 출력

for (String e : hs01) {

    System.out.print(e + " ");

}

 

// add() 메소드를 이용한 요소의 저장

hs02.add("임꺽정");

hs02.add("홍길동");

hs02.add("이순신");

 

// iterator() 메소드를 이용한 요소의 출력

Iterator<String> iter02 = hs02.iterator();

while (iter02.hasNext()) {

    System.out.print(iter02.next() + " ");

}

 

// size() 메소드를 이용한 요소의 총 개수

System.out.println("집합의 크기 : " + hs02.size());
  • 위의 예제에서 요소의 저장 순서를 바꿔도 저장되는 순서에는 영향을 미치지 않는다는 것을 확인 할수 있습니다. 또한 add()메서드를 사용하여 해당 HashSet에 이미 존재하는 요소를 추가하려고 하면,해당 요소를 저장하지 않고 false를 반환하는 것을 볼 수 있습니다.
  • 해당 HashSet에 이미 존재하는 요소인지를 파악하기 위해서는 내부적으로 다음과 같은 과정을 거치게 됩니다.

-해당 요소에서 HashCOde()메서드를 호출하여 반환된 해시값으로 검색할 범위를 결정합니다.
-해당 범위 내의 요소들을 equals()메서드로 비교합니다.

  • 따라서 HashSet에서 add()메서드를 사용하여 중복 없이 새로운 요소를 추가하기 위해서는 hashCode()와 equals()메서드를 상황에 맞게 오버라이딩(재정의)해야 합니다.

TreeSet클래스

TreeSet클래스는 데이터가 정렬된 상태로 저장되는 이진 검색 트리(binary serach tree)의 형태로 요소를 저장합니다.(이진검색은 오름차순으로 정렬된 리스트)

-이진 검색트리는 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.

package 컬렉션프레임워크;
import java.util.*;

public class TreeSetExample {
    public static void main(String[] args) {
        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 + " ");
        }
        System.out.println();
// remove() 메소드를 이용한 요소의 제거
        ts.remove(40);
// iterator() 메소드를 이용한 요소의 출력
        Iterator<Integer> iter = ts.iterator();
        while (iter.hasNext()) {
            System.out.print(iter.next() + " ");
        }
        System.out.println();
// size() 메소드를 이용한 요소의 총 개수
        System.out.println("이진 검색 트리의 크기 : " + ts.size());
// subSet() 메소드를 이용한 부분 집합의 출력
System.out.println(ts.subSet(10, 20));
System.out.println(ts.subSet(10, true, 20, true));


    }
}

  • 위의 예제에서 사용된 subSet()메서드는 10<=x<20 의 이미이다.
    -만약 10에서 20까지를 구하고싶다면
    -subSet(10,true,20,true)이렇게 쓰면 된다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글