[Java] 컬렉션 프레임워크(4) - Set 인터페이스

sobam·2022년 9월 28일
0

자바

목록 보기
7/18
post-thumbnail

📔 학습한 내용을 정리하기 위해 작성하는 게시글입니다.

🔑Set<E> 인터페이스


특징


  • 인덱스 정보를 포함하고 있지 않고, 동일한 데이터의 중복 저장을 허용하지 않는 자료구조(인덱스 정보가 없기 때문에 중복 데이터 중 특정 데이터를 지칭해 꺼낼 방법이 없음)
  • 저장 순서가 유지되지 않음(비정렬), 한 개의 null값만 저장할 수 있음
  • LinkedHashSetSet을 상속받았으나 저장 순서 유지, 중복 허용 X
  • Set<E>인터페이스를 구현한 대표적인 클래스로는 HashSet<E>, TreeSet<E>, LinkedHashSet<E>가 있음


Set<E> 인터페이스에서 사용되는 주요 메서드



구분리턴 타입  메서드명기능
데이터추가booleanadd(E element)매개변수로 입력된 원소를 리스트에 추가
booleanaddAll(Collection<? Extends E> c)매개변수로 입력된 컬렉션 전체를 추가
데이터 삭제booleanremove(Object o)원소 중 매개변수 입력과 동일한 객체 삭제
voidclear()전체 원소 삭제
데이터 정보 추출booleanisEmpty()Set<E> 객체가 비어 있는지 여부를 리턴
booleancontains(Object o)매개변수로 입력된 원소가 있는지 여부를 리턴
intsize()리스트 객체 내에 포함된 원소의 개수
Iterator<E>iterator()Set<E> 객체 내의 데이터를 연속해서 꺼내는 Iterator 객체 리턴
Set<E> 객체 배열 반환Object[]toArray()리스트를 Object 배열로 반환
T[]toArray(T[]t)입력매개변수로 전달한 타입의 배열로 반환



데이터 정보 추출 - iterator(), for each문


  • iterator()Set<E> 객체 내부의 데이터를 1개씩 꺼내 처리할 때 사용하는 메서드(인덱스 번호가 없어서 List<E> 객체처럼 for문으로 데이터 출력 불가능함)
  • iterator() 메서드 호출
    → 제네릭 클래스 타입인 Iterator<E>객체 생성
    hasNext() 메서드로 리턴 값이 false일 때, 마지막 데이터까지 읽음(hasNext()메서드는 다음 원소의 존재 여부를 불리언으로 리턴)
    next() 메서드로 다음 원소 위치로 가서 값을 리턴
    최초 Iterator<E> 객체가 생성되면 이 객체가 가리키고 있는 위치는 첫 원소가 아닌 첫 원소 바로 이전의 위칫값 → 즉, 첫 번째 원솟값을 읽기 위해서는 iterator.next()를 실행

📌 Iterator의 대표적인 메서드

리턴 타입메서드기능
booleanhasNext()다음으로 가리킬 원소의 존재 여부를 불리언으로 리턴
Enext()다음 원소 위치로 가서 읽은 값을 리턴



1. HashSet<E>


Set<E> 객체명 = new HashSet<E>();
  • Set<E> 인터페이스를 구현한 대표적인 구현 클래스
  • 가장 빠른 임의 접근 속도를 가짐
  • 요소를 순서 없이 저장하고 중복된 값은 저장하지 않음
  • 저장 순서를 유지해야 한다면 LinkedHasSet<E> 클래스를 사용
  • 데이터 입력 전, 중복 저장 방지를 위해 해시 알고리즘(hash algorithm)을 사용해 중복 데이터인지 검색
    → Object 클래스의 hashCode() 메서드에서 반환하는 해시 코드값에 해당하는 내부 목록 탐색
    → 선택된 대상 중에서 equals() 메서드를 호출하여 내용이 같은지 비교
    → true가 나오면 저장하지 않는다.
  • 저장 용량 동적 관리, 기본 생성자로 생성할 때 기본값은 16(List<E>는 10)

해시 알고리즘(hash algorithm)이란?

해시 함수(hash function)를 사용하여 데이터를 해시 테이블(hash table)에 저장하고, 다시 그것을 검색하는 알고리즘


HashSet 예제

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

public class Ex06_Set {
	public static void main(String[] args) {
		Set<String> set = new HashSet<>();
		set.add("orange");
		set.add("apple");
		set.add("banana");
		set.add("apple");
		
		System.out.println("객체 수: " + set.size());
		
		//반복자를 이용한 전체 출력
		for(Iterator<String> itr = set.iterator(); itr.hasNext();)
			System.out.print(itr.next() + '\t');
		System.out.println();
		
		//향상된 기능의 for문을 이용한 전체 출력
		for(String s : set)
			System.out.print(s + '\t');
		System.out.println();
	}
}

HashSet 예제 출력

객체 수: 3
orange	banana	apple	
orange	banana	apple	


2. LinkedHashSet<E>


Set<E> 객체명 = new LinkedHashSet<E>();
  • HashSet<E>의 자식 클래스로, HashSet<E>의 모든 기능에 데이터 간의 연결 정보만을 추가로 갖는 컬렉션(입력 순서 기억)
  • 출력 순서와 입력 순서가 동일
  • List<E>처럼 중간에 데이터 추가, 특정 순서에 저장된 값 가져오는 것은 불가능
  • 데이터 중복 허용 X


3. TreeSet<E>


Set<E> 객체명 = new Treeset<E>();
  • Set<E>의 기능에 크기에 따른 정렬(오름차순 정렬) 및 검색 기능이 추가된 컬렉션
  • 데이터가 정렬된 상태로 저장되는 이진 검색 트리(binary search tree)의 형태로 요소를 저장
  • 데이터를 입력 순서와 상관없이 저장하고, 크기순으로 출력
  • 중복 데이터는 저장 하지 않음
  • 다른 클래스와 달리 Navigable Set<E>SortedSet<E>를 부모 인터페이스로 둠 → TreeSet<E> 생성자로 객체를 생성해도 Set<E> 타입으로 선언하면 정렬 및 검색 기능 사용 할 수 없음

이진 탐색 트리(Binary Search Tree, BST)란?

트리 구조로써 부모 노드가 자신보다 작은 값을 가진 자식 노드와 자신보다 큰 값을 가진 자식 노드를 가지는 구조

  • 모든 노드는 이진 탐색 트리내에서 유일한 키를 가짐
  • 부모가 가지는 자식 노드의 수가 2개 이하
  • 각 노드의 왼쪽 자식 노드는 부모 노드 보다 작은 값, 오른쪽 자식 노드는 부모 노드 보다 큰 값을 가져야 함
  • 저장되는 자료의 중복 허용 X
  • 특정 값 탐색이 빠름

TreeSet 예제

import java.util.Iterator;
import java.util.TreeSet;

public class Ex08_TreeSet {
	public static void main(String[] args) {
		TreeSet<String> tree = new TreeSet<>();
		tree.add("홍길동");
		tree.add("전우치");
		tree.add("손오공");
		tree.add("멀린");
		tree.add("손오공");
		
		System.out.println("객체 수: " + tree.size());
		
		//Iterator 반복자에 의한 반복
		for(Iterator<String> itr = tree.iterator(); itr.hasNext();)
			System.out.print(itr.next().toString() + '\t');
		System.out.println();
	}
}

TreeSet 예제 출력

객체 수: 4
멀린	손오공	전우치	홍길동	


4. HashSet vs. LinkedHashSet vs. TreeSet


컬렉션데이터 중복저장 순서 유지구현 방식
HashSet<E>XX해싱(hashing)
LinkedHashSet<E>XX (입력된 순서대로 관리)
TreeSet<E>XO (오름차순 정렬)이진 탐색 트리(BST)
  • HashSet<E>에서는 두 객체가 같은지 다른지를 비교, TreeSet<E>에서는 두 객체의 크기를 비교



🔔 Referance

<이재환의 자바 프로그래밍 입문>
<Do it! 자바 완전 정복>
http://www.tcpschool.com/java/java_collectionFramework_set
https://hseungyeon.tistory.com/366

0개의 댓글

관련 채용 정보