본문 바로가기

JAVA

Set 컬렉션

반응형

List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서를 유지하지 않습니다. 또한 객체를 중복해서 저장할 수 없고, 하나의 null 만 저장할 수 있습니다.

Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있습니다. 다음은 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 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없습니다. 대신, 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator) 를 제공합니다. 반복자는 Iterator 인터페이스를 구현한 객체를 말하는데, iterator 메소드를 호출하면 얻을 수 있습니다.

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

 

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

리턴 타입 메소드명 설명
boolean hasNext() 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다.
E next() 컬렉션에서 하나의 객체를 가져온다.
void remove() Set 컬렉션에서 객체를 제거한다.

Iterator 에서 하나의 객체를 가져올 때는 next() 메소드를 사용합니다. next() 메소드를 사용하기 전에 먼저 가져올 객체가 있는지 확인하는 것이 좋습니다. hasNext() 메소드는 가져올 객체가 있으면 true를 리턴하고, 없으면 false를 리턴합니다. 따라서 true가 리턴될 때 next()메소드를 사용해야 합니다. 다음은 Set 컬렉션에서 String 객체들을 반복해서 하나씩 가져오는 코드입니다.

Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
	// String 객체를 하나 가져옴
	String str = iterator.next();
}

 

다음은 Set 컬렉션에서 "홍길동"을 제거하는 코드입니다.

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

 

1. HashSet

HasgSet은 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않습니다. HashSet이 판단하는 동일한 객체란 꼭 같은 인스턴스를 뜻하지 않습니다. HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode()메소드를 호출해서 해시코드를 얻어냅니다. 그리고 이미 저장되어 있는 객체들의 해시코드와 비교하여 동일한 해시코드가 있다면 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다.

문자열을 HashSet에 저장할 경우, 같은 문자열을 갖는 STring 객체는 동등한 객체로 간주되고 다른 문자열을 갖는 STring 객체는 다른 객체로 간주되는데, 그 이유는 String 클래스가 hashCode()와 equals() 메소드를 재정의해서 같은 문자열일 경우 hashCode()의 리턴값을 같게, equals()의 리턴값은 true가 나오게 했기 때문입니다. 다음은 HashSet 에서 String 객체를 추가, 검색, 제거하는 코드입니다.

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

public class HashSetExample1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Set<String> set = new HashSet<String>();
		
		set.add("JAVA");
		set.add("JDBC");
		set.add("Servlet/JSP");
		set.add("JAVA");	// 중복되므로 한번만 저장된다.
		set.add("iBATIS");
		
		int size = set.size();
		System.out.println("총 객체수 : " + size);
		
		Iterator<String> iterator = set.iterator();
		while(iterator.hasNext()) {
			String element = iterator.next();	// 객체 1개만 가져온다.
			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("비어 있음");
		
	}

}

 

반응형

'JAVA' 카테고리의 다른 글

모듈 기술자 (Java 11 버전 이후)  (3) 2019.12.18
"HashMap"의 "Value" 기준 정렬  (0) 2019.08.27
Map 컬렉션  (0) 2019.05.22
List 컬렉션  (0) 2019.05.22
자주쓰는 Eclipse 단축키 모음  (0) 2019.05.02