Set 컬렉션

Sunny·2023년 1월 12일
0

🌿 Set 컬렉션

Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet이 있다.

Set 컬렉션의 특징은 다음과 같다.

  • 저장 순서가 유지되지 않음
  • 객체를 중복해서 저장할 수 없음
  • 하나의 null만 저장할 수 있음

다음은 Set 컬렉션에서 공통적으로 사용 가능한 Set 인터페이스의 메소드이다. 인덱스로 관리하지 않기 때문에 인덱스로 매개값을 갖는 메소드가 없다.

기능메소드설명
객체 추가boolean add(E e)주어진 객체를 저장, 객체가 성공적으로 저장되면 true를 리턴. 중복 객체면 false를 리턴.
객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 여부
isEmpty()컬렉션이 비어 있는지 조사
Iterator< E> iterator()저장된 객체를 한 번씩 가져오는 반복자 리턴
int size()저장되어 있는 전체 객체 수 리턴
객체 삭제void clear()저장된 모든 객체를 삭제
boolean remove(Object o)주어진 객체를 삭제

다음은 Set 인터페이스의 메소드들의 사용 예제이다.

Set<String> set = ...;

// 객체 추가
set.add("홍길동");
set.add("신용권");

// 객체 삭제
set.remove("홍길동");

Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없다. 대신, 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator)를 제공한다. 반복자는 Iterator 인터페이스를 구현한 객체를 말하는데, iterator() 메소드를 호출하면 얻을 수 있다.

Set<String> set = ...;
Iterator<String> iterator = set.iterator();

다음은 Iterator 인터페이스에 선언된 메소드들이다.

리턴 타입메소드명설명
booleanhasNext()가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴
Enext()컬렉션에서 하나의 객체를 가져옴
voidremove()Set 컬렉션에서 객체를 제거

다음은 Iterator 인터페이스에 선언된 메소드들의 사용 예제이다.

Set<String> set = ...;
Iterator<String> iterator = set.iterator();

// 저장된 객체 수만큼 루핑
while(iterator.hasNext()) {
	String str = iterator.next(); // String 객체를 하나 가져옴
}

Iterator를 사용하지 않더라도 향상된 for문을 이용해서 전체 객체를 대상으로 반복할 수 있다.

Set<String> set = ...;
for(String str : set) {
	// 저장된 객체 수 만큼 루핑
}

🌿 HashSet

HashSet은 Set 인터페이스의 구현 클래스이다. HashSet을 생성하기 위해서는 다음과 같이 기본 생성자를 호출하면 된다.

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

HashSet의 특징으로는 다음과 같다.

  • 객체들을 순서 없이 저장
  • 동일한 객체는 중복 저장하지 않음

HashSet에서 동일한 객체인지 어떻게 알까?

HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어낸다. 그리고 이미 저장되어 있는 객체들의 해시코드와 비교한다. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장하지 않는다.

다음은 HashSet의 사용 예제이다.

import java.util.*;

public class ex {
	public static void main(String[] args) {
    	Set<String> set = new HashSet<String>();
        
        // 객체 저장
        set.add("Java");
        set.add("JDBC");
        set.add("Servlet/JSP");
        set.add("iBATIS");
        
        int size = set.size(); // 저장된 객체 수 얻기
        System.out.println("총 객체수: "+size);
        
        Iterator<String> iterator = set.iterator();
        while(iterator.hasNext()){
        	String element = iterator.next();
            System.out.println("\t"+element);
        }
        
        // 객체 삭제
        set.remove("JDBC");
        set.remove("iBATIS"); 
        
        System.out.println("총 객체수:"+set.size());
        
        iterator = set.iterator(); 
        while(iterator.hasNext()){
        	String element = iterator.next();
            System.out.println("\t"+element);
        }
        
        set.clear(); // 모든 객체를 제거하고 비움
        if(set.isEmpty()) {
        	System.out.println("비어 있음");
        }
    }
}
profile
개발에 재미를 붙여보기 :)

0개의 댓글