[Java] 자료구조: Collection (List, Set, Queue, Set, Stack)

Jiisuniui·2023년 10월 21일

Java의 모든 것

목록 보기
3/7
post-thumbnail

Collectin이란?

  • Java의 Collection이란 데이터의 집합, 그룹
  • JCF(Java Collections Framework) : 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
  • Collection 주요 인터페이스: List, Set, Queue
  • Map: Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류됨
  • Stack: List - Vector 클래스를 상속

List & Set & Map

List

1. List 특징

  • 입력 순서를 유지하며, 데이터의 중복을 허용
  • 인덱스를 통해 저장 데이터에 접근이 가능

2. List 인터페이스의 주요 구현체

  • ArrayList
    - 단반향 포인터 구조 데이터 순차적 접근(조회)가 빠름
  • LinkedList
    - 양방향 포인터 구조 데이터 삽입, 삭제가 빠름

3. 2중 LinkedList

List<List<Integer> list = new ArrayList<>();
list[0].add(value);
list[0].get(0);

Set

1. Set 특징

  • 입력 순서를 유지하지 않으며, 데이터의 중복 허용하지 않음
  • 데이터에 null 입력 가능하나, 한 번만 저장하고 중복 저장을 허용하지 않음
  • 인덱스가 따로 존재하지 않기 때문에 Iterator를 사용하여 조회

2. Set 인터페이스의 주요 구현체

a. HashSet

  • 입력 순서를 보장하지 않으며, 데이터의 중복을 허용하지 않음

b. LinkedHashSet

  • 입력 순서를 보장하며, 데이터의 중복을 허용하지 않음

c. TreeSet

  • (default) 입력한 데이터의 크기가 비교 가능한 경우 오름차순으로 정렬되며, 데이터의 중복을 허용하지 않음
  • 입력하는 데이터가 사용자 정의 객체인 경우 Comparable을 구현하여, 정렬 기준 설정 가능

Map

1. Map 특징

  • Key&Value 구조
  • Key(키)는 입력 순서를 유지하지 않으며, 중복을 허용하지 않음, Value(값)는 중복을 허용
  • 인덱스가 따로 존재하지 않기 때문에 Iterator를 사용하여 조회

2. Map 인터페이스의 주요 구현체

a. HashMap

  • Key(키)에 대한 입력 순서를 보장하지 않으며, 중복 Key(키)를 허용하지 않음

b. LinkedHashMap

  • Key(키)에 대한 입력 순서를 보장하며, 중복 Key(키)를 허용하지 않음

c. TreeMap

  • 레드-블랙 트리(Red-Black Tree)를 기반으로 Key&Value를 저장
  • default: 입력한 Key(키)데이터의 크기가 비교 가능한 경우 오름차순으로 정렬되며, 중복 Key(키)를 허용하지 않음
  • 입력하는 데이터가 사용자 정의 객체인 경우 Comparable을 구현하여, 정렬 기준 설정 가능

Queue & Stack

  • Queue: FIFO (First In First Out)
  • Stack: LIFO (Last In First Out)

Queue

1. Queue란?

  • 선입 선출(FIFO: First In First Out)의 성격을 지닌 자료구조

2. Queue 선언

Queue<Integer> q = new LinkedList<>();
Queue q = new LinkedList();	// 아무 자료형이나 가능

3. Queue Method

  • 사용: offer, poll, peek, clear
// 삽입
q.offer(value); // 반환(boolean)? true : false (실패)
q.add(value);	// 반환(boolean)? true : Exception (실패)

// 삭제
q.poll();		// 반환(해당type)? value : null (공백)
q.remove();		// 반환(해당type)? value : NoSuchElementException (공백)
q.remove(value)	// 반환(boolean)? true : false (공백)

// queue 맨 앞 값 조회
q.peek();		// 반환(해당type)? value : null (공백)
q.element();	// 반환(해당type)? value : Exception (공백)

// 초기화
q.clear();		// 반환(void)

4. PriorityQueue (우선 순위 큐)

  • 우선 순위를 가지는 큐
  • 수행할 작업이 여러 개 있고 시간이 제한되어 있을 때 우선순위가 높은 것부터 수행할때 쓰임
    -> ex) 네트워크 제어, 작업 스케쥴링
  • 우선순위 큐에 저장할 객체는 필수적으로 Comparable 인터페이스를 구현
    -> compareTo() 메서드 로직에 우선순위를 결정
  • 저장공간으로 배열을 사용하며, 각 요소를 힙(heap) 형태로 저장
  • null 저장 불가능

5. Dequeue (Double-Ended Queue)

  • 양쪽으로 넣고 빼는 것이 가능한 큐
  • 스택과 큐를 하나로 합쳐놓은 것과 같음
    -> 스택으로 사용할 수도 있고, 큐로 사용할 수도 있음
  • Deque의 조상은 Queue, 구현체로 ArrayDeque와 LinkedList가 있음

a. ArrayDequeue

  • 스택으로 사용할 때 Stack 클래스보다 빠르며, 대기열로 사용할 때는 LinkedList보다 빠름
  • 사이즈 제한 X
  • null 저장 X

b. LinkedList

  • LinkedList는 List 인터페이스와 Queue 인터페이스를 동시에 상속받고 있기 때문에, 스택 / 큐 로서도 응용이 가능
  • 실제로 LinkedList 클래스에 큐 동작과 관련된 메서드를 기본으로 지원
    -> ex) push, pop, poll, peek, offer

Stack

1. Stack이란?

2. Queue 선언

Stack<Integer> st = new Stack<>();

3. Queue Method

// 삽입
st.push(value); // 반환(boolean)? true : false (실패)

// 삭제
st.pop();		// 반환(해당type)? value : EmptyStackException (공백)

// stack 맨 위 값 조회
st.peek();		// 반환(해당type)? value : EmptyStackException (공백)

// 초기화
st.clear();		// 반환(void)

참고자료

profile
why error?

0개의 댓글