Set, Queue

Java의 데이터 타입과 예외

Jim White

Java Developer

Set 인터페이스

  • SetCollection의 한 종류
    • 중복 객체를 허용하지 않음
      • 각 원소의 고유성을 보장
    • 일반적으로 Set은 순서가 없음(즉, 인덱스 없음)
  • List는 약통처럼 각 객체가 특정 칸(위치)에 있음
  • Set은 자루처럼 객체가 무작위로 담겨 있음

List는 인덱스 위치에 객체를 보관하는 약통과 유사

Set은 객체가 무작위로 담긴 자루와 유사

1 이미지: Wikimedia Commons 제공
Java의 데이터 타입과 예외

List vs Set

  • Set 사용 시점
    • 원소의 고유성을 보장
    • 조회가 더 빠름
      • 객체가 Set에 있는지 확인
    • 컬렉션이 클수록 메모리 효율적
    • 캐시에서 멤버십 테스트에 적합
      • 예: 문서의 고유 단어 찾기
Java의 데이터 타입과 예외

List vs Set

  • List 사용 시점
    • 순서를 보존하고 중복 허용
    • 위치로 원소 접근 시 성능 우수
    • 인덱스로 추가/삭제 시 성능 우수
    • 원소 순서가 중요할 때 적합
      • 예: 순서도 단계, 플레이리스트 곡 관리
Java의 데이터 타입과 예외

Set 구현체

  • Set의 다양한 구현체
    • HashSet이 대표적
  • HashSet
    • 순서 없는 객체 모음
    • 삽입/삭제/조회가 다른 Set 구현보다 빠름
    • 일반적으로 다른 Set보다 메모리 더 사용
    • null 1개 저장 가능

HashSet은 순서 없는 모음이며 null 하나 허용

Java의 데이터 타입과 예외

HashSet 생성

  • 제네릭 생성자로 HashSet 생성
    HashSet<String> set = new HashSet<String>();
    
  • HashSetjava.util 패키지에 있음
    • import 필요
    • import java.util.HashSet
Java의 데이터 타입과 예외

HashSet 메서드

  • .add(), .remove()로 객체 추가/삭제
  • 교체: .remove().add()
  • .contains()로 존재 여부 확인
  • 중복은 무시됨
  • null 허용
  • 순서 보장 안 됨
set.add("France");
set.add("Japan");
set.add("Brazil");
set.add("Egypt");
set.add(null); // null is allowed
set.remove("Brazil");
boolean z =
  set.contains("France"); // z is true
set.add("Japan"); // Ignored
System.out.println(set);
[null, Japan, Egypt, France]
Java의 데이터 타입과 예외

Queue 인터페이스

  • Queue는 선입선출(FIFO)로 처리하는 자료구조
    • 먼저 추가된 객체가 먼저 제거됨
    • 매표소 줄과 유사
    • 머리(head)와 꼬리(tail) 객체가 있음

머리(시작)와 꼬리(끝)가 표시된 큐 이미지

  • Queue 구현체가 여러 가지
    • 동작과 연산이 유사함
Java의 데이터 타입과 예외

ArrayBlockingQueue

  • 대표적인 Queue 구현체
    • 내부적으로 배열 사용
  • 주의: ArrayBlockingQueuejava.util.concurrent 패키지에 있음
    • java.util에 있지 않음
Java의 데이터 타입과 예외

ArrayBlockingQueue 생성

  • 제네릭 생성자로 ArrayBlockingQueue 생성
    • 생성자에서 용량(최대 개수) 지정
import java.util.concurrent;  // 클래스 상단에 위치

// 문자열 4개 저장 가능한 큐 생성
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(4);
Java의 데이터 타입과 예외

ArrayBlockingQueue 메서드

  • 꼬리에 추가: .add(object) 또는 .offer(object)
    • .add(object)는 용량 초과 시 예외 발생
    • .offer(object)는 용량 초과 시 무시
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
queue.offer("France");
queue.offer("Japan");
queue.offer("Brazil");
queue.offer("Egypt");
queue.offer("China"); // Ignores China

// Causes IllegalStateException
// queue.add("China");

System.out.println(queue);
[France, Japan, Brazil, Egypt]
Java의 데이터 타입과 예외

ArrayBlockingQueue 메서드

  • 머리에서 제거: .remove() 또는 .poll()
    • .remove()는 비어 있으면 예외 발생
    • .poll()은 비어 있으면 null 반환
  • null은 허용하지 않음
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
String x = queue.poll(); // x is null
// Causes NoSuchElementException
// String y = queue.remove();

queue.offer("France");
String next = queue.poll();
System.out.println(next);
France
Java의 데이터 타입과 예외

연습해 봅시다!

Java의 데이터 타입과 예외

Preparing Video For Download...