💻공부/Java ☕️
[Java] - Set과 HashSet
강켄트
2023. 1. 17. 03:16
Set(집합)이란?
Java의 컬렉션 프레임워크 중 하나로 데이터를 저장하는 추상자료형이다.
데이터의 순서를 보장하지 않고, 데이터의 중복을 허용하지 않는다.
즉, 중복되지 않는 원소의 모임
Set의 특징
집합에 있는 동일한 데이터를 저장하면 Set에는 중복된 데이터가 존재하지 않는다.
(동일한 값을 삽입해도 Set에는 하나의 값만 존재 )
Set은 언제 사용할까?
중복된 데이터를 제거해야할 경우
데이터의 존재 여부를 확인해야할 경우
HashSet이란?
Set의 대표 구현 클래스이다.
데이터의 순서를 보장하지 않고, 데이터의 중복을 허용하지 않는다.
HashSet은 내부적으로 HashMap을 사용하기 때문에 자바에서 HashSet과 HashMap은 동일하다고 말할 수 있다.
사용방법
java.util.Set 클래스를 임포트한다.
Set은 인터페이스이기 때문에 직접 생성할 수 없고, Set의 구현체인 HashSet 클래스를 구현해서 사용한다.
import java.util.HashSet;
import java.util.Set;
HashSet 메서드
메서드 | 설명 |
boolean add(E o) | 제네릭 타입으로 넘어온 객체가 HashSet 내부에 존재하지 않으면 추가하고 true, 존재하지 않으면 false 반환 |
int size() | HashSet에 저장된 원소의 수를 반환 |
Iterator<E> iterator() | HashSet의 원소들을 순서대로 처리하기 위해 Iterator객체로 반환 |
boolean contains(Objuct o) | 인자로 전달된 객체를 원소로 가지고 있으면 true 반환 |
boolean isEmpty() | HashSet에 저장된 요소가 없으면 true 반환 |
예시)
import java.util.Iterator;
import java.util.HashSet;
import java.util.Set;
public class SetExam{
public static void main(String[] args){
//HashSet 선언
Set<String> set = new HashSet<>();
//HashSet에 값 추가
//입력되는 값이 HashSet 내부에 존재하지 않는다면 HashSet에 추가하고 true, 존재하면 false 리턴
boolean player1 = set.add("이강인");
boolean player2 = set.add("손흥민");
boolean player3 = set.add("조규성");
boolean player4 = set.add("황희찬");
boolean player5 = set.add("조규성"); //중복
//HashSet 크기 구하기
//size()
System.out.println("size= " +set.size());
System.out.println("player1= " +player1);
System.out.println("player2= " +player2);
System.out.println("player3= " +player3);
System.out.println("player4= " +player4);
System.out.println("player5= " +player5);
//Iterator : 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자
Iterator<String> iterator = set.iterator();
//HashSet에 저장된 값 출력
//hasNext() : 꺼낼 객체가 있으면 true, 없으면 false
while(iterator.hasNext()){
//next() : 하나를 꺼낸다. 하나를 꺼내면 자동으로 다음 것을 참조한다.
String str = iterator.next();
System.out.println("str= " +str);
}
}
}
결과
데이터의 중복을 허용하지 않기 때문에 중복으로 들어간 player5가 제거되었다.
데이터의 순서를 보장하기 때문에 넣은 순서와 상관없이 값이 출력되었다.
🤔 HashSet에 저장된 값을 확인할 때 for문과 같은 반복문을 사용하지 않고 Iterator를 사용한 이유는?
Set은 순서가 없는 컬렉션이라서 인덱스도 존재하지 않기때문이다.
인덱스가 없기 때문에 일반 for문을 사용할 수 없지만, for-each문은 사용할 수 있다.
하지만, 자료구조를 돌다가 값을 수정, 삭제해야 해서 수정, 삭제를 수행하는 코드를 넣으면
ConcurrentModificationException이 발생한다.