[JAVA] Deque + 왜 LinkedList보다 ArrayDeque로 구현하는 것이 더 좋을까?

2024. 12. 6. 18:33·JAVA

안녕하세요.

오늘은 자바의 Deque 인터페이스에 대해 설명하겠습니다.

그리고 왜 ArrayDeque로 Queue/Stack/Deque를 구현하는 것이 LinkedList 구현보다 더 유리한지 알아보겠습니다.

 

[ 목차 ]

     

     

    Deque란?

    FIFO와 LIFO 두 방식으로 데이터 처리가 가능한 자료구조입니다.

    양방향 삽입 및 삭제가 가능합니다.

     

    Queue 인터페이스를 확장한 인터페이스입니다.

    ArrayDeque, LinkedList, PriorityDeque로 구현할 수 있습니다.

    자바의 컬렉션 프레임워크에 속합니다.

     

    자바의 컬렉션 프레임워크란?

    컬렉션 : 다수의 데이터

    프레임워크 : 표준화된 프로그래밍 방식

    -> 데이터 그룹을 저장하는 클래스들을 표준화한 설계 입니다.

     

    컬렉션 프레임워크 사용시, 객체지향적이고 재사용성이 높은 코드를 작성할 수 있습니다.

    컬렉션 프레임워크의 주요 인터페이스로는 List/Set/Map이 있습니다.

     

     

     

     

    Deque를 구현할 수 있는 클래스들

    1. ArrayDeque : 배열을 기반으로 합니다. 성능이 우수하여 가장 자주 사용됩니다.

    2. LinkedList : 연결리스트를 기반으로 합니다. 빠른 삽입과 삭제를 제공합니다.

    3. PriorityDeque : 표준 라이브러리에는 없는 커스텀 구현체입니다. 우선순위를 기반으로 합니다.

     

     

     

    왜 ArrayDeque가 LinkedList보다 더 유리할까

    코딩테스트를 위한 코드를 짠다면, Queue와 Stack은 ArrayDeque로 구현하는 것이 압도적으로 유리합니다.

    배열 기반이라 전/후 노드 노드 참조가 필요 없어 메모리 사용이 적기 때문입니다.

     

    더 적은 메모리를 사용한다.

    ArrayDeque는 배열 기반 자료구조 입니다.

    따라서 연속적인 메모리 공간에 데이터를 저장하므로, 추가적인 참조 비용(이전 노드, 다음 노드)이 필요하지 않습니다.

     

    하지만 LinkedList는 이중 연결 리스트 기반 자료구조입니다.

    따라서 각 요소는 담 노드와 이전 노드에 대한 참조를 저장하기 위해 추가적인 메모리가 필요합니다.

     

    더 높은 효율을 갖는다.

    LinkedList로 구현하게 된다면, 각 노드는 힙 메모리의 흩어진 위치에 저장된다.

    메모리 할당이 분산되어 있기 때문에 캐시 효율이 떨어지게 된다.

     

    그럼에도 LinkedList가 필요한 경우

    1. 중간에 빈번한 삽입/삭제가 발생한다면 LinkedList가 더 유리합니다. (= 중간 연결 데이터 자주 조작해야할 때)

    2. 데이터의 양이 매우 크고 배열의 확장이 비효율적이라면 LinkedList가 더 유리합니다.

     

     

     

     

     

    예외를 발생시키지 않는 건(안전한 조회) 오 폴 픽 !

     

    Deque의 삽입 메서드 (offer / add)

    1. addFirst : 덱의 맨 앞에 요소를 삽입 합니다. 실패 시 IllegalStateException을 발생시킵니다.

    2. addLast : 덱의 맨 뒤에 요소를 삽입 합니다 . 실패 시 IllegalStateException을 발생시킵니다.

    3. offerFirst(E e) : 덱의 맨 앞에 요소를 삽입 합니다 . 성공 시 true, 실패 시 false 반환합니다.

    4. offerLast(E e) : 덱의 맨 뒤에 요소를 삽입 합니다 . 성공 시 true, 실패 시 false 반환합니다.

     

     

     

    Deque의 삭제 메서드 (poll / remove)

    pollFirst() / pollLast() / removeFirst() / removeLast() 가 있다.

     

     

     

    Deque의 요소 반환 메서드 (peek / element)

    peekFirst() / peekLast() / elementFirst() / elementLast() 가 있다.

     

     

     

     

     

     

     

    기억하세요...

    예외를 발생시키지 않는 건(안전한 조회) 오 폴 픽 ! (offer poll peek)

    'JAVA' 카테고리의 다른 글

    [JAVA] 자바의 Map, 그리고 순회  (0) 2024.12.10
    [JAVA] 인터페이스란(Interface)? - 추상클래스와의 차이  (1) 2024.12.09
    [JAVA] Stack  (0) 2024.12.07
    [Java] Queue  (0) 2024.12.05
    'JAVA' 카테고리의 다른 글
    • [JAVA] 자바의 Map, 그리고 순회
    • [JAVA] 인터페이스란(Interface)? - 추상클래스와의 차이
    • [JAVA] Stack
    • [Java] Queue
    hyeblee
    hyeblee
    감자감자
    • hyeblee
      hyeblee
      hyeblee
    • 전체
      오늘
      어제
      • 분류 전체보기
        • PS
          • Programmers
          • BAEKJOON
          • CODETREE
        • ALGORITHM
        • JAVA
        • CS
          • 면접을 위한 CS전공지식
        • SPRING
        • 회고
    • 블로그 메뉴

      • 홈
      • 태그
      • 방명록
    • 링크

      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

      backjoon
      java #스프링부트 #자바버전 #자바 버전 충돌 #jvm
      java
      BFS
      알고리즘
      숨바꼭질3
      반닫힌 구간
      상한값
      플레이데이터 백엔드 부트캠프
      흐른 일수 계산
      java #deque #자바 #덱
      하한값
      플레이데이터 백엔드 후기
      플레이데이터 백엔드
      15652
      spring #springboot #스프링 #스프링부트
      16954
      spring #스프링 #스프링부트 #springboot #please sign in
      arrays.sort #collections.sort #list.sort #객체정렬 #배열정렬 #timsort #dual pivot quicksort #정렬 #자바
      구간 칠하기
      BOJ
      플레이데이터 백엔드 부트캠프 후기
      백트래킹
      흐른 시간 계산
      dfs
      왔다 갔던 구역2
      백준
      자바
      날짜와 시간 계산
      탐색
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    hyeblee
    [JAVA] Deque + 왜 LinkedList보다 ArrayDeque로 구현하는 것이 더 좋을까?
    상단으로

    티스토리툴바