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 |