๐ฌ์๋ก
java์์ ์ ๊ณตํ๋ java.util.Stack ํด๋์ค๋ ๋์์ธ์ด ์๋ชป๋์ด ์ฌ์ฉ์ ์ง์ํ๊ณ ์์ต๋๋ค.
์ด์ ๋ฅผ ์งง๊ฒ ์ ๋ฆฌํ์๋ฉด ์๋ฐ์ Stack ํด๋์ค๋ ์์ ํด๋์ค๋ก Vector๋ฅผ ์์๋ฐ๋๋ฐ, ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- Synchronized๋ก ์ธํ ์ฑ๋ฅ ์ ํ ๋ฐ์
Vector๋ ๋ชจ๋ ๋ฉ์๋์ synchronized๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ์กฐํ๋ง ํ๋ ๊ฒฝ์ฐ์๋ ๋๊ธฐํ๋ก ์ธํด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํฉ๋๋ค. Stack์์ ์ ๊ณตํ๋ ๋ฉ์๋ ์ญ์ synchronized๋ฅผ ์ฌ์ฉํด์ ๋๊ธฐํ ์ฒ๋ฆฌํ๋๋ฐ, ๋ด๋ถ์ ์ผ๋ก Vector๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ด์ค์ผ๋ก ๋๊ธฐํ ์ฒ๋ฆฌ๊ฐ ๋ฐ์ํ์ฌ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ํ์ ์ ์ถ ๊ตฌ์กฐ ์๋ฐ
์คํ์ ํ์ ์ ์ถ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ๊ตฌ์กฐ์ ๊ท์น์ ์๋ฐํ๋ ์ ๊ทผ์ ๋ถ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ํ์ง๋ง Stack์ Vector๊ฐ ์ ๊ณตํ๋ add(int index, E element), removeElementAt(int indx)๋ฉ์๋๋ฅผ ํตํด ํน์ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ์๋ฐ ๊ณต์ API์์กฐ์ฐจ ๋ ์์ ํ๊ณ ์ผ๊ด๋ Deque ์ธํฐํ์ด์ค์ ๊ทธ ๊ตฌํ์ฒด๋ค์ ์ฌ์ฉํ๋ผ๊ณ ๋ช ์๋์ด์์ต๋๋ค. (์ด๋ฌํ Stack ๊ตฌ์กฐ๋ ์๋ฐ์ ํ์ ํธํ์ฑ์ ์ํด์ ์์๊ด๊ณ๋ฅผ ๊ณ์ ์ ์งํ๊ณ ์์ต๋๋ค.)
์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ์ ๋ถ์ ๋ค์๊ธ์ ์ฐธ๊ณ ํด๋ณด์๋ฉด ์ข์๊ฒ ๊ฐ์ต๋๋ค.

์ด๋ฒ๊ธ์์๋ ๊ทธ๋ ๋ค๋ฉด Stack์ ํ์๋ก ํ ๋ Deque์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ก LinkedList์ ArrayDeque๋ฅผ ๋น๊ตํ๊ธฐ ์ํด ์์ฑํ์์ต๋๋ค.
๐์คํฌโ
๊ฒฐ๋ก ์ด ๊ถ๊ธํ์ ๋ถ๋ค์ ์ํด ๋จผ์ ๋ง์๋๋ฆฌ์๋ฉด Stack, Deque๋ก ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด ArrayDeque๊ฐ ํจ์จ์ ์ ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ArrayDeque๊ฐ ํจ์จ์ ์ ๋๋ค.
LinkedList๋?
LinkedList๋ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ ํด๋์ค์ ๋๋ค. ๊ฐ ๋ ธ๋๊ฐ ๋ฐ์ดํฐ์ ํจ๊ป ์ด์ ๋ฐ ๋ค์ ๋ ธ๋์ ์ฐธ์กฐ๋ฅผ ํฌํจํฉ๋๋ค.
์ฃผ์ ํน์ง
- ๋์ ํฌ๊ธฐ: ๋ฐ์ดํฐ ํฌ๊ธฐ์ ๋ฐ๋ผ ์๋์ผ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ฉ๋๋ค.
- ์ฝ์ /์ญ์ ์ฑ๋ฅ: ์ ๋์์์ ์ฝ์ ๊ณผ ์ญ์ ๋ฟ ์๋๋ผ ์ค๊ฐ์ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ๋งค์ฐ ๋น ๋ฆ ๋๋ค(์๊ฐ๋ณต์ก๋: O(1)).
- ์ ๊ทผ ์ฑ๋ฅ: ํน์ ์ธ๋ฑ์ค์ ์ ๊ทผํ๋ ค๋ฉด ๋ ธ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์ํด์ผ ํ๋ฏ๋ก ๋๋ฆฝ๋๋ค(์๊ฐ๋ณต์ก๋: O(n)).
- ๋ฉ๋ชจ๋ฆฌ ์๋น: ๊ฐ ๋ ธ๋๊ฐ ๋ค์/์ด์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ถ๊ฐ์ ์ธ ์ฐธ์กฐ(ํฌ์ธํฐ)๋ฅผ ์ ์ฅํด์ผ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ ๋ง์ต๋๋ค.
์ด๋ฌํ ํน์ง์ผ๋ก ์ธํด ์ค๊ฐ ์์น์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋น๋ฒํ ๋ฐ์ํ๊ฑฐ๋ ์ ํฉํ ๊ฒฝ์ฐ, ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ ์ ๋์ ์ด๊ณ ํน์ ์ธ๋ฑ์ค ์ ๊ทผ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ์ ์ ๋ฆฌํฉ๋๋ค.
ArrayDeque
ArrayDeque๋ ๋์ ๋ฐฐ์ด ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ ํด๋์ค์ ๋๋ค. ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ํฌ๊ธฐ๋ฅผ ๋๋ ค ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐฐ์ดํฉ๋๋ค.
ArrayDeque์ ์ฃผ์ ํน์ง
- ๋์ ํฌ๊ธฐ: ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ํ์ฌ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ฉด ๋ด๋ถ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ 2๋ฐฐ๋ก ์ฆ๊ฐ์ํต๋๋ค. ๋ฐ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ์ ๊ฒ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ํฌ๊ธฐ๋ฅผ ์ค์ผ ์๋ ์์ต๋๋ค.
- ์ฝ์ /์ญ์ ์ฑ๋ฅ: ์ ๋์์์ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ํ๊ท ์ ์ผ๋ก ๋น ๋ฆ ๋๋ค(์๊ฐ๋ณต์ก๋: ํ๊ท O(1), ํฌ๊ธฐ ์ด๊ณผ ์ O(n)).
- ๋๋ค ์ ๊ทผ ์ฑ๋ฅ: ๋ฐฐ์ด ๊ธฐ๋ฐ์ด๋ฏ๋ก ์์ฐจ์ ์ ๊ทผ์ด ๋งค์ฐ ๋น ๋ฆ ๋๋ค(์๊ฐ๋ณต์ก๋: O(1)).
- ๋ฉ๋ชจ๋ฆฌ ์๋น: ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ณด๋ค ํจ์จ์ ์ ๋๋ค(์ถ๊ฐ์ ์ธ ์ฐธ์กฐ๊ฐ ์๊ธฐ ๋๋ฌธ).
์ด๋ฌํ ํน์ง์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ถ์ ๊ฒฝ์ฐ ์ค๊ฐ ์์น์ ์ฝ์ /์ญ์ ๊ฐ ๋น๋ฒํ์ง ์๋๊ฒฝ์ฐ, ๋ฐ์ดํฐ ํฌ๊ธฐ์ ์ ๋์ฑ์ด ํฌ์ง ์์ ๊ฒฝ์ฐ์ ์ ๋ฆฌํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Stack์ผ๋ก ์ฌ์ฉ ์ ArrayDeque๊ฐ ๋ ์ ํฉํ ์ด์ ๋?
Stack์ ์ค๊ฐ ์ฝ์ /์ญ์ ๊ฐ ์์ผ๋ฏ๋ก LinkedList์ ์ถ๊ฐ์ ์ธ ์ด์ (์ค๊ฐ ์ฝ์ /์ญ์ )์ ํ์ฉ๋์ง ์์ต๋๋ค. ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ ์ธก๋ฉด์์ LinkedList๋ ๊ฐ ์ด์ /๋ค์ ๋ ธ๋์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ ์ธก๋ฉด์์ ArrayDeque๊ฐ ์ด์ ์ด ์์ต๋๋ค.
๋ํ ArrayDeque๋ ๊ตฌํ์ด ๋ฐฐ์ด๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ๊ตฌ์ฑ์์๋ค์ด ์๋ก ๋ฐ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์์ต๋๋ค. ํ์ง๋ง LinkedList๋ ๊ฐ๊ฐ์ ์์๊ฐ ๊ฐ์ฒด๋ก ๋ฐ๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ ํ ์์น์ ์์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋งจ ๋ค์ ๊ฐ์ ๊บผ๋ด๋ฉด์ ํ์ํ๋ Stack์ ํน์ง๋๋ก ํ์์ ํ๋ฉด ๋ฐฐ์ด ๊ธฐ๋ฐ์ ArrayDeque๊ฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ธฐ๋ฐ์ LinkedList๋ณด๋ค ๋ ๋น ๋ฆ ๋๋ค!

์ฌ๊ธฐ์ ์ ๋ ํ๊ฐ์ง ๊ฑฑ์ ์ด ๋ค์์ต๋๋ค.
ArrayDeque๋ ๋ฐฐ์ด ๊ธฐ๋ฐ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ํ์ฌ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ์ด๊ณผํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ๋ฐ์ํฉ๋๋ค:
- ์ ๋ฐฐ์ด ์์ฑ: ๊ธฐ์กด ๋ฐฐ์ด ํฌ๊ธฐ์ 2๋ฐฐ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ณต์ฌ: ๊ธฐ์กด ๋ฐฐ์ด์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ณต์ฌํฉ๋๋ค. ์ด ์์ ์ O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
- ์ฐธ์กฐ ๋ณ๊ฒฝ: ๋ด๋ถ์ ์ผ๋ก ์๋ก์ด ๋ฐฐ์ด์ ์ฌ์ฉํ๋๋ก ์ฐธ์กฐ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
๋ฐ์ดํฐ๊ฐ ๋ง์์ง๊ณ ๋ฐฐ์ด ํ์ฅ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ ๊ฒฝ์ฐ, ๋ณต์ฌ ์์ ์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ํนํ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ๋ฌธ์ ๊ฐ ๋์ฑ ์ปค์ง ๊ฒ์ ๋๋ค.
- ์ด๊ธฐ์ ๋งค์ฐ ์์ ํฌ๊ธฐ์ ๋ฐฐ์ด๋ก ์์ํ์ฌ ์ฆ์ ํฌ๊ธฐ ํ์ฅ์ด ํ์ํ ๊ฒฝ์ฐ.
- ์ฝ์ ์์ ์ด ๋น๋ฒํ ๋ฐ์ํ๋ฉฐ, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์์ฃผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ.
ํ์ง๋ง ํ์ฅ ์์ ์ ๋น๋๋ ๋ฎ๊ธฐ๋๋ฌธ์ ๋๋ถ๋ถ์ ์ฝ๋ฉํ ์คํธ/์ค์ ์ฌ์ฉ ์ฌ๋ก์์๋ ํฌ๊ฒ ๋ฌธ์ ๋์ง ์๋๋ค๊ณ ํ๋จํ์์ต๋๋ค. ArrayDeque๋ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ 2๋ฐฐ์ฉ ์ฆ๊ฐ์ํค๋ฏ๋ก, ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ ๋๋ง ํ์ฅ์ด ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐฐ์ด์ ์ด๊ธฐ ํฌ๊ธฐ๊ฐ 8์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด, 8 → 16 → 32 → 64์ ๊ฐ์ด ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํฉ๋๋ค. ์ฆ, ๋ฐ์ดํฐ ์ฝ์ ์ด ๋ง๋๋ผ๋ ํ์ฅ ์์ ์ ์ ์ ๋๋ฌผ๊ฒ ๋ฐ์ํฉ๋๋ค.
์ค์ ์ฑ๋ฅ ํ ์คํธ
์ด๋ฌํ ์๊ฐ์ ๊ฒ์ฆํ๊ธฐ ์ํด ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์งํํ์์ต๋๋ค.
1์ต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ณ ๋ค์ 1์ต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๊ณผ์ ์ ๋๋ค.
package barkingDog.stack;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
public class StackTest {
static int N = 100_000_000;
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
Deque<Integer> stack = new ArrayDeque<>();
// Deque<Integer> deque = new LinkedList<>();
int count = 0;
while(count++ <N){
stack.addLast(1);
}
while(count++ <N){
stack.pollLast();
}
long end = System.currentTimeMillis();
System.out.println("===== ArrayDeque =====");
// System.out.println("===== LinkedList =====");
System.out.println("๊ฑธ๋ฆฐ ์๊ฐ : " + (end - start)+"ms");
}
}
๋จผ์ ArrayDeque๋ฅผ 5๋ฒ ์คํํ ๊ฒฐ๊ณผ ํ๊ท 2501ms๊ฐ ์์๋์์ต๋๋ค.
๋ค์์ผ๋ก LinkedList๋ก 5๋ฒ ์คํํ ๊ฒฐ๊ณผ ํ๊ท 10114ms๊ฐ ์์๋์์ต๋๋ค.
์ฝ 4๋ฐฐ์ ๋์ ์๊ฐ์ด ์ฐจ์ด๋๋ค๋๊ฒ์ ์์์์์ต๋๋ค.
๊ฒฐ๋ก
๊ฒฐ๋ก ์ ์ผ๋ก Stack์ผ๋ก์ ArrayDeque๊ฐ LinkedList๋ณด๋ค ํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค. ์ด๊ธ์ ์ฝ์ผ์๋ ๋ถ๋ค ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ํ์ค ๋ Deque์ ๊ตฌํ์ฒด๋ก ArrayDeque๋ฅผ ์ฌ์ฉํ์ ์ ์๊ฐ์ด๊ณผ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ง ์์ผ์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค! ๐
์ฐธ๊ณ
'CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ๋ฐฑ์ค - 5212 ] ์ง๊ตฌ ์จ๋ํ- 5212 ] ์ง๊ตฌ ์จ๋ํ (1) | 2025.04.16 |
---|---|
[ ์ด๋ก ] - Greedy ์๊ณ ๋ฆฌ์ฆ (1) | 2025.04.11 |
[ ๋ฐฑ์ค - 2529 ] ๋ถ๋ฑํธ (0) | 2025.04.10 |
[ ๋ฐฑ์ค - 2210 ] ์ซ์ํ ์ ํ (0) | 2025.04.09 |
[๋ฐฑ์ค-1182] ๋ถ๋ถ์์ด์ ํฉ (0) | 2025.04.08 |
๋๊ธ