[JAVA] 컬렉션 프레임웍 : List (2) - Stack & Queue

DongGyu Jung·2022년 2월 18일
0

자바(JAVA)

목록 보기
32/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕

*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.



🧶 Stack 과 Queue

아마 알고리즘을 공부하고
자료구조를 공부하게 되면 지금까지 알아봤던 List 배열과 함께 가장 많이 접하는 구조이지 않을까 싶다.
바로 " Stack(스택) "과 " Queue(큐) "다.

간단하게 차이점을 알아보자.

  • 스택 (Stack) : LIFO (Last-In First-Out) 구조로 데이터 저장/삭제
    : "저장" = push / "삭제" = pop
    ( 직전 작업 되돌리기 / 짝 & 순서 맞추기 : " 수식 계산 " , " 괄호 검사 ", " undo/redo 작업 " , " 뒤로/앞으로 작업 " )

  • 큐 (Queue) : FIFO (First-In First-Out) 구조로 데이터 저장/삭제
    : "저장" = offer / "삭제" = poll
    ( 오래된 순으로 삭제되는 목록 : " 최근 사용 문서 " , " 인쇄 작업 대기목록 ", " 버퍼(Buffer) " )

스택의
" 가장 늦게 들어간 데이터가 가장 먼저 나오게되는 구조 "라는 특징은
앞서 배웠던 배열기반의 ArrayList의 장점을 활용하기에 적합하다.

ArrayList는 마지막 순서부터 차례대로 삭제하는 방식이 가장 효율적인 컬렉션이다.
스택의 LIFO 구조와 찰떡인 점을 미뤄봐아
스택(Stack)을 구현할 때, ArrayList로 활용하는 것이 좋다.

반대로
큐는
" 가장 먼저 들어간 데이터가 가장 먼저 나오게되는 구조 "라는 특징을 가지고 있기 때문에
ArrayList를 사용하게된다면
앞에서부터 모두 null & 복사의 과정을 많이 반복하게 되서 매우 비효율적일 것이다.

그렇기 깨문에
큐(Queue)를 구현할 땐
데이터 추가/삭제가 용이한 LinkedList가 적합하다는 것을 알 수 있다.


※ 메서드

예외가 발생하는 메서드는 try - catch문 경우에 사용

스택 (Stack)큐 (Queue)
《 추가 》
예외-boolean add( Object o )
( 성공 : true / 실패 : false )
( 저장공간 부족하면 IllegalStateException )
예외 XObject push( Object item )boolean offer( Object o )
( 성공 : true / 실패 : false )
《 삭제 & 반환 》
예외Object pop()
( 비어있을 때 EmptyStackException )
Object remove()
( 비어있을 때 NoSuchElementException )
예외 XObject poll()
( null 반환 )
《 조회 》
예외Object peek()
( 비어있을 때 EmptyStackException )
Object element()
( 비어있으면 NoSuchElementException 반환 )
예외 X<위치 반환>
int search( Object o )
( 못찾으면 -1 반환 )
( 배열과 달리 1부터 시작 : " 맨 위 " = 1 )
Object peek()
( null 반환 )
《 검사 》
boolean empty()
비어있는지
``

여기서 중요한 것이
자바에서는

스택Stack클래스로 구현해서 제공해주지만
는 " Queue 인터페이스 "로 정의만 해놓고 별도 클래스는 없다.
대신
자바 API문서를 살펴보면 " Queue를 정의해 놓은 All Known Implementing Classes "가 있으니 골라서 쓰면 된다.
( 앞서 살펴봤었던 LinkedList클래스도 Queue인터페이스를 구현한 클래스이다. )

물론 각 클래스에 정의된 메서드들이 수행하는 기능은 비슷하지만
서로 내용이 조금 다른 메서드를 가질 수 있으니 검토를 해보는 것이 좋다.

또한
참조변수 타입Implementing Class 타입으로 범위를 좁혀주는 것이 좋다.

0개의 댓글