JAVA 16. 컬렉션(Deque)

김창민·2024년 7월 30일

BE

목록 보기
18/50

오라클 컬렉션 스팩

컬렉션을 사용하긴 하지만, 더 자세히 알아보도록 하자.
오라클 문서

위 사진에서 볼 수 있듯 Collection은 우선 Interface이다. 그 하위에 있는 Subinterface도 무지많고, 구현체는 더 많은걸 확인할 수 있다.

구현체를 위주로 한번 살펴보자면 크게 3가지로 볼 수 있는데, Queue와 Deque는 그냥 나눠서 4개로 확인해보자

Deque

ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList

Queue는 한쪽 끝에서는 삽입만 이뤄지고, 반대쪽에서는 제거만 이루어지는 형태였다. Deque의 경우 Double-ended-queue의 준말로 양쪽 끝에서 둘다 삽입/제거가 가능한 형태다.

이런 특성으로 Deque는 큐로도 쓰이지만 스택으로도 쓸 수 있다. (스택은 한쪽이 막혀있고, 한쪽 끝에서만 삽입/제거가 이뤄지는 구조다.)

Deque 사진

위 사진에서 볼 수 있듯, Deque의 Superinterfaces에 Queue가 있는걸 볼 수 있다. 즉, Dequq도 Queue인데 좀 특이한 형태의 Queue라고 생각하면 된다.

공통 메소드

Queue로 사용시

addLast(e) : tail에 값을 삽입하는것. 꽉차거거나 하면 예외 반환
offerLast(e) : tail에 값을 삽입하는것. 꽉차거거나 하면 null 반환
removeFirst() : head에서 값을 삭제하는 것. 비었거나 하면 예외 반환
pollFirst() : head에서 값을 삭제하는 것. 비었거나 하면 null 반환
getFirst() : head에서 값을 확인하는 것. 비었거나 하면 예외 반환
peekFirst() : head에서 값을 확인하는 것. 비었거나 하면 null 반환

Stack으로 사용시

Stack은 LIFO(후입선출)이다.
addFirst(e) : tail에 값을 삽입하는것. 꽉차거거나 하면 예외 반환
removeFirst() : tail에서 값을 삭제하는 것. 비었거나 하면 예외 반환
peekFirst() : head에서 값을 확인하는 것. 비었거나 하면 null 반환

ArrayDeque

동적크기를 갖고, null 요소는 금지된다.
Stack클래스로 구현된 Stack보다 빠르고 Queue로 사용되는 LinkedList보다 빠르다.
그 이유는 배열 기반이라 캐시hit률이 높고, 중간 삽입/삭제가 적으면 메모리 관리가 효율적이기 때문이다. Stack, Queue는 중간에서 삽입/삭제가 이뤄지지 않아서 이런듯.

하지만, 스레드 안전하지 않아서 동기화 문제가 발생한다. Stack은 동기화 메서드를 제공하는데 이는 아니다.

최초 16크기를 할당받기 때문에 16개 이하의 원소만 사용시 메모리 낭비가 될 수도 있다.

ConcurrentLinkedDeque

쓰레드 안전한 Deque다. 다중 스레드 환경에서 안전하게 사용할 수 있으며, 동시성 문제를 효과적으로 처리한다. 또한 non-blocking 알고리즘을 사용해서 높은 성능과 확장성을 제공한다.

LinkedBlockingDeque

쓰레드 안전한 블로킹 Deque이다.

LinkedList

생략

profile
일일 회고 : https://rlackdals981010.github.io/

0개의 댓글