일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Kotlin
- 반복문
- 연습문제
- map
- 리눅스마스터 3과목
- 문자열
- 개발자 회고록
- 명령어
- 코딩테스트
- toCharArray
- 고잉버스
- 자바
- 자바스크립트 코딩의 기술
- 프로그래머스
- 리눅스마스터1급
- 월간코드챌린지
- 카카오
- 리눅스
- 코테
- java 백준 1차원 배열
- Memoir
- Java
- 백준 javascript
- Linux
- GoingBus
- JavaScript
- 리눅스마스터 1급 정리
- 백준 java
- 스프링 빈
- 스프링 컨테이너
- Today
- Total
hoon's bLog
Java Stack, Queue Collection Class, 자바 큐 스택 선언 및 생성 본문
지난 포스팅에서는 컬렉션 클래스 중 하나인 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 클래스는 스택 메모리 구조를 표현하기 위해, 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 인터페이스는 큐 메모리 구조를 표현하기 위해, 다음과 같은 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
https://docs.oracle.com/javase/8/docs/api/java/util/Stack.html
https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html
'IT > Java' 카테고리의 다른 글
Java Set Collection Class, 자바 Set 선언 예제 (1) | 2023.08.07 |
---|---|
Java Map Collection Class, 자바 맵 선언 및 사용 (4) | 2023.08.04 |
Java List Collection Class 자바 리스트 컬렉션 클래스 (2) | 2023.07.28 |
Java generic 자바 다양한 제네릭 표현 (0) | 2021.01.26 |
Java Generic 자바 제네릭 선언 및 생성 (0) | 2021.01.11 |