Language/JAVA

[JAVA] Set 컬렉션

IT수정 2024. 10. 18. 09:28

Set 컬렉션

List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다. Set 컬렉션은 수학의 집합에 비유될 수 있다. 집합은 순서와 상관없고 중복이 허용되지 않기 때문이다. 또한 구슬주머니와도 같다. 동일한 구슬을 두 개 넣을 수 없으며, 들어갈 때와 나올 때 순서가 다를 수도 있기 때문이다.

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

 

HashSet

Set 컬렉션 중에서 가장 많이 사용되는 것이 HashSet이다. 다음은 HashSet 컬렉션을 생성하는 방법이다.

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

 

HashSet은 다른 객체라도 hashCode() 메서드와 리턴값이 같고, equals() 메서드가 true를 리턴하면 동일한 객체라고 판단하고 중복 저장하지 않는다.

 

다음은 중복 값이 추가될 경우 중복 저장하지 않는 예제이다.

package ch15;

import java.util.*;

public class HashSetExample {

	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("JSP");
		set.add("Java");
		set.add("Spring");
		
		int size = set.size();
		System.out.println("총 객체 수: " + size);
	}

}

 

출력 결과

총 객체 수: 4

 

다음 예제는 이름과 나이가 동일할 경우 Member 객체를 HashSet에 중복 저장하지 않는다. Member 클래스를 선언할 때 이름과 나이가 동일하다면 동일한 해시코드가 리턴되도록 hashCode()를 재정의하고, equals() 메서드가 true를 리턴하도록 재정의했기 때문이다.

package ch15;

public class Member {
	public String name;
	public int age;
	
	public Member(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public int hashCode() {
		return name.hashCode() + age;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Member target) {
			return target.name.equals(name) && (target.age==age);
		} else {
			return false;
		}
	}
}
package ch15;

import java.util.*;

public class HashSetExample2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Set<Member> set = new HashSet<Member>();
		
		set.add(new Member("홍길동", 30));
		set.add(new Member("홍길동", 30));
		
		System.out.println("총 객체 수: " + set.size());
	}

}

 

출력 결과

총 객체 수: 1

 

Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메서드가 없다. 대신 객체를 한 개씩 반복해서 가져와야 하는데, 여기에는 두 가지 방법이 있다. 하나는 다음과 같이 for문을 이용하는 것이다.

Set<E> set = new HashSet<>();
for(E e : set) {
...
}

 

다른 방법은 다음과 같이 Set 컬렉션의 iterator() 메서드로 반복자를 얻어 객체를 하나씩 가져오는 것이다.

Set<E> set = new HashSet<>();
Iterator<E> iterator = set.iterator();

 

iterator는 Set 컬렉션의 객체를 가져오나 제거하기 위해 다음 메서드를 제공한다.

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

 

사용 방법은 다음과 같다.

while(iterator.hasNext()) {
	E e = iterator.next();
    }

 

예제 코드

package ch15;

import java.util.*;

public class HashSetExample3 {

	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("JSP");
		set.add("Spring");
		
		Iterator<String> iterator = set.iterator();
		while(iterator.hasNext()) {
			String element = iterator.next();
			System.out.println(element);
			if(element.equals("JSP")) {
				iterator.remove();
			}
		}
		System.out.println();
		
		set.remove("JDBC");
		
		for(String element : set) {
			System.out.println(element);
		}
	}

}

 

출력 결과

Java
JSP
JDBC
Spring

Java
Spring

 

'Language > JAVA' 카테고리의 다른 글

[JAVA] 검색 기능을 강화시킨 컬렉션  (0) 2024.10.18
[JAVA] Map 컬렉션  (0) 2024.10.18
[JAVA] List 컬렉션  (0) 2024.10.17
[JAVA] 데몬 스레드와 스레드풀  (3) 2024.10.17
[JAVA] 스레드 메서드  (0) 2024.10.17