Language/JAVA

[JAVA]Set 의 개념,종류 및 사용법

윤진노 2022. 8. 21. 17:05

Set 이란?

Set을 먼저 한글로 해석 하면, 집합이다.

Set 인터페이스를 구현한 컬렉션 클래스는 여러가지가 있는데 공통된 특징이 있다.

 

1. 요소의 저장 순서를 유지하지 않는다.

2. 같은 요소의 중복 저장이 되지 않는다.

 

중요한 것은 그냥 순서가 아니고 저장 순서라는 점이다. 

대표적인 Set 컬렉션 클래스는 HashSet,TreeSet이 있다.

 

HashSet

HashSet 클래스는 Set 컬렉션 클래스 중 가장 많이 쓰인다.

앞서 설명했던 HashMap과 마찬가지로, 이름에서 알 수 있다시피, 해싱기법을 사용하여 검색 속도가 아주 우수하다.

HashSet 클래스는 내부적으로 HashMap 인스턴스를 이용하여 요소들을 저장한다.

 

 

 

 

 

TreeSet

TreeSet 클래스는 HashSet과 더불어 많이 쓰이는 Set 컬렉션 클래스이다.

이진 검색 트리를 발전시킨 레드-블랙 트리의 형태로 요소를 저장한다.

그렇기 때문에, 데이터를 추가하거나, 제거하는 등 기본 동작 시간이 빠르다.

 

 

Set 선언 및 메소드


Set 선언

선언 및 메소드는 HashSet을 이용하여 예제를 보여주도록 하겠다.

HashSet<String> set = new HashSet<>(); //new에서 타입 파라미터를 생략한 HashSet 생성

Set을 선언하면서 초기화도 함께 가능하다.

 

Set 값 추가

 

set.add(value);

Set에 데이터를 추가하기 위해서는 add 메소드를 사용한다.

 

Set 값 삭제

set.remove(value); //value 삭제
set.clear(); //전체 삭제

remove 메소드를 이용하여 특w정 값을 삭제할수도 있고, clear 메소드를 이용하여 전체 값을 삭제할 수도 있다.

 

 

 

Set 값 출력

import java.util.*;

public class Main {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("진영");set.add("철수"); set.add("혜미");set.add("영희");



        System.out.println(set); //[철수, 영희, 진영, 혜미]
        Iterator<String> it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        //철수
		//영희
		//진영
		//혜미

    }
}

그냥 println(Set)을 해도 위 나온것처럼 출력이 가능하다.

하나씩 출력을 하기위해서는 Iterator(반복자)를 이용해야 된다.

for문을 사용하지 않은 것은 Set은 Index를 이용하여 관리하지 않기 때문이다.

 

위에서 보면 알다시피, 저장하는 순서가 없기 때문에, 진영을 제일 먼저 추가했지만 출력할때는 처음이 아닌 다른 순서로 나오게 된다.

 

그 외 공통메소드

  • boolean contains(Object o) : 해당 집합이 전달된 객체를 포함하고 있는지를 확인함
  • boolean equals(Object o) :해당 집합과 전달된 객체가 같은지를 확인함
  • boolean isEmpty() : 해당 집합이 비어있는지를 확인함
  • int size() : 해당 집합의 요소의 총 개수를 반환함

 

TreeSet - 순서관련 메소드

TreeSet은 기본적으로 자동으로 정렬을 해주기 때문에 순서가 있다.

  • first() : 최솟값 반환
  • last():  최댓값 반환
  • higher(value) : 입력값보다 큰 데이터 중 최솟값 반환
  • lower(value) : 입력값보다 작은 데이터 중 최댓값 반환

이러한 메소드가 TreeSet에는 존재한다.

first(),last()는 최솟값, 최댓값 반환이라고 되어 있지만, 엄밀히 말하면 그렇지 않다.

TreeSet을 처음에 생성할 때 아무것도 설정하지 않으면 기본으로 오름차순으로 정렬된다.

허나, Collections.reverseOrder()를 사용하면 내림차순으로 정렬이 가능하다.

이렇게 내림차순으로 정렬이 되어 있을땐, first()는 최댓값을 반환하고, last()는 최솟값 반환한다.