hoon's bLog

Java Stack, Queue Collection Class, 자바 큐 스택 선언 및 생성 본문

IT/Java

Java Stack, Queue Collection Class, 자바 큐 스택 선언 및 생성

개발한기발자 2023. 7. 31. 09:40
반응형


지난 포스팅에서는 컬렉션 클래스 중 하나인 List(리스트)에 대해서 알아보았다.

그런데 문득 예~~전 포스팅 중에 프로그래머스 2019 카카오 개발자 인턴십 문제를 푼게 생각이 났는데,

그때 당시 문제 풀이를 Stack(스택)으로 풀었던 것이 생각났다!

Vector는 그렇다 치더라도(진짜 실무 소스에서도 본 적이 없음....),

Stack이 비효율적이라고 설명했지만, 그래도 종종 쓰이기도 하고,

개념적인 차원에서 Queue(큐)와 세트로 알고 있으면 좋겠다 싶다는 생각도 들어서 포스팅하게 되었다.

그렇다면 Stack과 Queue를 함께 알아보도록 하자!

Stack<E> 클래스란?

Stack 문법은 다음과 같다.

import java.util.Stack;

Stack<Object> stack = new Stack<>();

List 컬렉션 클래스의 Vector 클래스를 상속받아, 전형적인 스택 메모리 구조의 클래스를 제공한다!
Stack 메모리 구조는 선형 메모리 공간에 데이터를 저장하면서,

후입선출(LIFO, Last In First Out) 형태를 따르는 자료 구조다.
즉, 후입선출(LIFO)이란, 가장 나중에 저장된(push) 데이터가 가장 먼저 인출(pop)되는 구조라고 할 수 있다.

Stack(스택) 메모리 구조

Stack 메모리 구조를 설명하기 전에 Stack에서 쓰이는 메서드들을 먼저 알아보면 좋을 것 같다.

Stack 클래스는 스택 메모리 구조를 표현하기 위해, Vector 클래스의 메서드를 5개만 상속받아 사용한다.

boolean empty() 해당 스택이 비어 있으면 true를, 비어 있지 않으면 false를 반환함.
E peek() 해당 스택의 제일 상단에 있는(제일 마지막으로 저장된) 요소를 반환함.
E pop() 해당 스택의 제일 상단에 있는(제일 마지막으로 저장된) 요소를 반환하고, 해당 요소를 스택에서 제거함.
E push(E item) 해당 스택의 제일 상단에 전달된 요소를 삽입함.
E clear() 해당 스택의 내용 전부 삭제.
E size() 해당 스택의 크기 반환.
int search(Object o) 해당 스택에서 전달된 객체가 존재하는 위치의 인덱스를 반환함.
이때 인덱스는 제일 상단에 있는(제일 마지막으로 저장된) 요소의 위치부터 0이 아닌 1부터 시작함.

위 그림과 같이 메모리가 구성되어 있다고 가정할 때,

10이라는 데이터가 먼저 들어왔지만, 후입선출(LIFO) 구조에 따라 나중에 들어온 20이라는 데이터가 먼저 나오게 된다.

실생활을 예로 하면, 지하철 문쪽에 나중에 탄 사람이, 문이 열릴 때 제일 먼저 내릴 수 있는 구조이다.

코드로 표현하면, 아래처럼 표현할 수 있겠다.

// 스택의 생성
Stack<Integer> st = new Stack<Integer>();

// push() 이용한 요소의 저장
st.push(10);
st.push(20);

// peek() 이용한 요소의 반환
System.out.println(st.peek());  // 20
System.out.println(st);         // [10, 20]

// pop() 이용한 요소의 반환 및 제거
System.out.println(st.pop());  // 20
System.out.println(st);        // [10]
 
// search() 이용한 요소의 인덱스 반환(1부터 시작)
System.out.println(st.search(10));  // 1

Queue<E> 인터페이스란?

Queue 문법은 다음과 같다.

import java.util.LinkedList;

LinkedList<Object> qu = new LinkedList<Object>();

으잉? 근데 Stack은 클래스인데 왜 Queue는 인터페이스(Interface)???
클래스로 구현된 스택과는 달리 자바에서 큐 메모리 구조는 별도의 인터페이스 형태로 제공된다.
이러한 Queue 인터페이스를 상속받는 하위 인터페이스는

Deque<E>, BlockingDeque<E>, BlockingQueue<E>, TransferQueue<E> 가 있다.
따라서 Queue 인터페이스를 직간접적으로 구현한 클래스는 상당히 많다고 한다.
그중에서도 Deque 인터페이스를 구현한 LinkedList 클래스가 큐 메모리 구조를 구현하는 데 가장 많이 사용되곤 한다.

 

또한 큐 메모리 구조는 스택과 반대로, 선입선출(FIFO, First In First Out)을 따르는 자료 구조다.

가장 먼저 저장된(push) 데이터가 가장 먼저 인출(pop)되는 구조다.

큐(Queue) 메모리 구조

Queue 인터페이스는 큐 메모리 구조를 표현하기 위해, 다음과 같은 Collection 인터페이스 메소드만을 상속받아 사용한다.

boolean add(E e) 해당 큐의 맨 뒤에 전달된 요소를 삽입함.
만약 삽입에 성공하면 true를 반환하고, 큐에 여유 공간이 없어 삽입에 실패하면 IllegalStateException을 발생시킴.
E element() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.
boolean offer(E e) 해당 큐의 맨 뒤에 전달된 요소를 삽입함.
E peek() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함.
만약 큐가 비어있으면 null을 반환함.
E poll() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환하고, 해당 요소를 큐에서 제거함.
만약 큐가 비어있으면 null을 반환함.
E remove() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 제거함.

위 그림과 같이 메모리가 구성되어 있다,

"하나"라는 데이터가 먼저 들어오고, 선입선출(FIFO) 구조에 따라 먼저 들어온 "하나" 데이터가 먼저 반환되고,

이후에 들어온 "둘" 데이터가 남게 되는 것이다.

쉽게 말해, 식당 입장할 때, 대기 순번에 따라 입장하는 것과 같다고 볼 수 있다.

코드로 표현하면, 아래처럼 표현할 수 있겠다.

LinkedList<String> qu = new LinkedList<String>(); // 큐의 생성

// add() 메소드를 이용한 요소의 저장
qu.add("하나");
qu.add("둘");

// peek() 메소드를 이용한 요소의 반환
System.out.println(qu.peek()); // 하나
System.out.println(qu);        // [하나, 둘]

// poll() 메소드를 이용한 요소의 반환 및 제거
System.out.println(qu.poll()); // 하나
System.out.println(qu);        // [둘]

// remove() 메소드를 이용한 요소의 제거
qu.remove("둘");
System.out.println(qu);       //[]

 

이렇게 Stack, Queue Collection에 대해 알아봤는데,

역시나 마찬가지로 쓰임에 따라 사용하는게 좋겠다.

실무에서는 여전히 List나 Map을 사용하는게 압도적이지만,

여러 기술 알아서 나쁠거 있나?ㅎㅎㅎ

 

그리고 포스팅하면서 느꼈지만,

확실히 java API 문서를 한 번이라도 보면,

수학의 정석처럼 뭔가 직관적으로 알고, 깊이 알아가는 느낌이 나기도 한다!

그리고 어쨌든, 가장 공적인 문서이니 꼭 한 번씩 정독해 보는 것도 추천한다!

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

끝.

 

Reference

http://www.tcpschool.com/java/java_collectionFramework_stackQueue

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

https://docs.oracle.com/javase/8/docs/api/java/util/Stack.html

 

Stack (Java Platform SE 8 )

The Stack class represents a last-in-first-out (LIFO) stack of objects. It extends class Vector with five operations that allow a vector to be treated as a stack. The usual push and pop operations are provided, as well as a method to peek at the top item o

docs.oracle.com

https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html

 

Queue (Java Platform SE 8 )

A collection designed for holding elements prior to processing. Besides basic Collection operations, queues provide additional insertion, extraction, and inspection operations. Each of these methods exists in two forms: one throws an exception if the opera

docs.oracle.com

 

728x90
반응형