Java μ Stack λμ Deque
π€ΉββοΈ
μλ°μμ μλ£κ΅¬μ‘° Stack μ λμ ν΄μ μ¬μ©νλ Deque μ λν΄μ μμ보μ. μ΄ κΈμ κΈ°λ₯μ μ¬μ©νλ λ°©μμ΄ μλ βμ Stack λμ Deque λ₯Ό μ¬μ©ν΄μΌ νλκ°?βμ λν΄μ μ€λͺ νλ€.
Stack
νμ μ μΆ(Last In First Out, λμ€μ λ€μ΄κ° κ°μ΄ λ¨Όμ λμ¨λ€) μλ£κ΅¬μ‘°λ₯Ό ꡬνν μλ°μ ν΄λμ€λ€. μλ°μ Stack μ List Collection μ Vector λ₯Ό μμλ°μ μ€ν λ©λͺ¨λ¦¬ ꡬ쑰μ ν΄λμ€λ₯Ό μ 곡νλ€. λ°°μ΄ κΈ°λ° λ°μ΄ν° κ΅¬μ‘°λ‘ μΈλ±μ€λ‘ μμμ μ‘μΈμ€ ν μ μλ€.
public class Application {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("첫 λ²μ§Έ μμ");
stack.push("λ λ²μ§Έ μμ");
System.out.println(stack.pop());
}
}
// μ€ν κ²°κ³Ό
// > Task :Application.main()
// λ λ²μ§Έ μμ
Queue
μ μ μ μΆ(First In First Out, λ¨Όμ λ€μ΄κ° κ°μ΄ λ¨Όμ λμ¨λ€) μλ£κ΅¬μ‘°λ₯Ό ꡬνν μλ°μ μΈν°νμ΄μ€λ€. μΈλ±μ€λ‘ μμμ μ κ·Όμ΄ λΆκ°λ₯νλ€.
Deque
Queue μΈν°νμ΄μ€λ₯Ό νμ₯ν μΈν°νμ΄μ€λ€. μλ£μ μ μΆλ ₯μ μ λμμ ν μ μλ€. μΈλ±μ€λ‘ μμμ μ‘μΈμ€, μ½μ , μ κ±°λ₯Ό νμ©νμ§ μλλ€.
public class Application {
public static void main(String[] args) {
Deque<String> deque = new ArrayDeque<>();
deque.addFirst("첫 λ²μ§Έ μμ"); // "첫 λ²μ§Έ μμ"
deque.add("λ λ²μ§Έ μμ"); // "첫 λ²μ§Έ μμ", "λ λ²μ§Έ μμ"
deque.push("μΈ λ²μ§Έ μμ"); // "μΈ λ²μ§Έ μμ", "첫 λ²μ§Έ μμ", "λ λ²μ§Έ μμ"
System.out.println(deque.pop());
System.out.println(deque.pop());
}
}
// μ€ν κ²°κ³Ό
// > Task :Application.main()
// μΈ λ²μ§Έ μμ
// 첫 λ²μ§Έ μμ
Stack vs Deque
곡μ λ¬Έμλ μ΄λ κ² λ§νκ³ μλ€.
λμ± μμ νκ³ μΌκ΄λ LIFO μ€ν μμ μ Deque μΈν°νμ΄μ€ λ° ν΄λΉ ꡬνμ μ¬μ©νμ¬ κ΅¬ννλ κ²μ΄λ€.
μ¦, Stack λμ Deque μ ꡬνμ²΄μΈ ArrayDeque μ¬μ©μ μ μνκ³ μλ€. Java μμ Vector λ νΉμ μν©μμ ν¨μ¨μ μ΄μ§ μκΈ° λλ¬Έμ Thread Safe μλ€κ³ ν μ μλ€. κ·Έλ κΈ° λλ¬Έμ Vector λ₯Ό μμλ°μ Stack μ λ€μκ³Ό κ°μ λ¨μ μ΄ μ‘΄μ¬νλ€.
- μ΄κΈ° μ©λ μ€μ μ μ§μνμ§ μλλ€.
- λͺ¨λ μμ
μ Lock μ΄ μ¬μ©λλ€.
- λ¨μΌ μ€λ λ μ€ν μ±λ₯μ΄ μ ν λ μ μλ€.
- λ¨μν Iterator μ νμ μμ μμλ get() λ©μλ μ€ν μ λ§€λ² Lock μ΄ λ°μνκ² λλ― λ‘ μ€λ²ν€λκ° μ»€μ§λ€.
- Stack μ Vector μμλ°μκΈ° λλ¬Έμ λ€μ€ μμμ μ§μνμ§ μλλ€.
Deque μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄ νμν λͺ¨λ μ€ν μμ μ μ 곡νκΈ° λλ¬Έμ νΈλ¦¬νλ€. λν, μμ μ Lock μ μ¬μ©νμ§ μκΈ° λλ¬Έμ λ¨μΌ μ€λ λμμλ λ¬Έμ κ° λ°μνμ§ μλλ€. λ€λ§, λ€μ€ μ€λ λ μ€νμ κ²½μ° λ¬Έμ κ° λ μ μμ§λ§ ArrayDeque μ λν λκΈ°ν λ°μ½λ μ΄ν°λ₯Ό ꡬνν μ μλ€. λ°μ½λ μ΄ν°λ λ©μλκ° μ€νλκΈ° μ μ λ¨Όμ μ€νλλ λ©μλλ₯Ό λ§νλλ° μ΄μ λν μμλ₯Ό λ€λ£¨κΈ°μλ λ΄μ©μ΄ λ°©λν΄μ§λ―λ‘ κΆκΈνλ€λ©΄ μ¬κΈ°μμ νμΈν΄λ³΄λ©΄ λλ€. μ΄λ JCF μ Stack ν΄λμ€μ μ μ¬νκ² μνλμ§λ§, Stack ν΄λμ€μ μ΄κΈ° μ©λ μ€μ λΆμ‘± λ¬Έμ λ₯Ό ν΄κ²°νλ€. Stack μ μ΄κΈ° μ©λμ μ€μ ν μ μλ μμ±μκ° μκΈ° λλ¬Έμ λ°μ΄ν°μ μ½μ μ΄ λ§μμ§λ©΄ λ°°μ΄μ 볡μ¬νλ μν©μ΄ λΉλ²νκ² λ°μνλ€. ArrayDeque μ μμ±μλ‘ λ°°μ΄μ μ΄κΈ° ν¬κΈ°λ₯Ό μ§μ ν μ μκ³ μ©λμ΄ μ΄κ³Όνλ©΄ κΈ°μ‘΄ μ©λμ 2λ°°λ‘ λλ €μ£Όκ±°λ μ€μ¬μ£Όλ λ‘μ§μ΄ μ‘΄μ¬νλ€.
μ€λ λ μμ μ±
λ°μ΄ν° κ΅¬μ‘°κ° Thread Safe νμ§ μμ κ²½μ° λμμ μ‘μΈμ€νλ©΄ κ²½μ μ‘°κ±΄μ΄ λ°μν μ μλ€. μλ μμλ₯Ό ν΅ν΄ μ΄ν΄λ³΄μ.
- 첫 λ²μ§Έ μ€λ λκ° μ½λ A λ₯Ό μ€ννλ€.
- λ λ²μ§Έ μ€λ λκ° μ½λ A λ₯Ό μ€ννλ€. λ μ€λ λ λͺ¨λ κ°μ object κ° λ΄κΈ΄λ€.
- 첫 λ²μ§Έ μ€λ λκ° μ½λ B λ₯Ό μ€ννλ€.
- λ λ²μ§Έ μ€λ λκ° μ½λ B λ₯Ό μ€ννλ€. μ€μ μ μ©λλ κ²μ μΈλ±μ€κ° μ΄ 2 λ² λ°λλ€.
- 첫 λ²μ§Έ μ€λ λκ° μ½λ C λ₯Ό μ€ννλ€.
- 첫 λ²μ§Έ μ€λ λκ° μ½λ C λ₯Ό μ€ννλ€. λ μ€λ λ λͺ¨λ κ°μ object κ° λ°νλλ€.
public class MyDeque {
transient Object[] elements;
transient int head;
transient int length;
public Object pollFirst() {
Object object = elements[head]; // μ½λ A
if (object != null) {
elements[head] = null;
head = head + 1; // μ½λ B
length = length - 1;
}
return object; // μ½λ C
}
}
κ°κ° λ©μλλ₯Ό μ€νν λλ§λ€ λ€λ₯Έ κ°μ΄ λ°νλμ΄μΌ νμ§λ§ μμ κ°μ΄ λμΌν κ°μ²΄κ° λ°νλλ λ¬Έμ κ° λ°μνλ κ²μ μ μ μλ€. μ΄λ¬ν κ²½ν© μνλ₯Ό νΌνκΈ° μν΄μ μ½λ Bμμ μΈλ±μ€ μ¬μ€μ μ μλ£ν λκΉμ§ μ½λ A λ₯Ό μ€ννμ§ μμμΌ νλ€.
μ΄λ€ ꡬν체λ₯Ό μ¬μ©ν κΉ?
λ©ν°μ€λ λ νκ²½κ³Ό μκ΄μμ΄ μλ°μμμ Stack μ λλΆλΆμ 쑰건μμ μ±λ₯ μ νλ₯Ό μΌμΌν€κΈ° λλ¬Έμ μ¬μ©μ μ§μνλ€. λμ μ Deque μ ꡬν체λ₯Ό μ¬μ©νλ€. μΌλ°μ μΌλ‘ μ¬μ©νλ Deque μ ꡬν체λ ArrayDeque κ³Ό LinkedList κ° μλ€. λμ μ°¨μ΄μ μ μ΄ν΄λ³΄μ.
- ArrayDeque μ Deque μΈν°νμ΄μ€μ ꡬν체μ΄λ©° ν¬κΈ°κ° μ¬μ€μ μ ν μ μλ€.
- LinkedList λ List μ ꡬν체λ€.
- LinkedList λ null μμλ₯Ό μΆκ°ν μ μμ§λ§ ArrayDeque μ λΆκ°λ₯νλ€.
- LinkedList λ λ°λ³΅μ€μ νμ¬ μμλ₯Ό μ κ±°νλ κ²μ΄ ν¨μ¨μ μ΄κ³ , ArrayDeque μ μμͺ½ λμμ μΆκ°, μ κ±°κ° ν¨μ¨μ μ΄λ€.
- LinkedList λ ArrayDeque λ³΄λ€ λ λ§μ λ©λͺ¨λ¦¬λ₯Ό μλͺ¨νλ€.
- λ©λͺ¨λ¦¬ μλͺ¨λμ΄ μ μ λλ iterate ν¨μ¨μ΄ μ’μ ArrayDeque λ₯Ό μ¬μ©νκ³ μ€νμ μ¬μ΄μ¦κ° 컀μ§κ±°λ μ¬ν λ³λμ΄ μμλ λλ μ¦κ°μ μΈ λ©λͺ¨λ¦¬ κ³΅κ° ν보λ₯Ό μν΄ LinkedList λ₯Ό μ¬μ©νλ€.
λ©ν°μ€λ λ νκ²½
λ©ν°μ€λ λ νκ²½μμλ μ€λ λλ‘λΆν° μμ ν Deque μ μ¬μ©ν΄μΌ νλ€. μ΄ κ²½μ°μλ κ°κ° LinkedBlockingDeque μ ConcurrentLinkedDeque λ₯Ό μ¬μ©νλ©΄ λλ€. λμ Thread-Safe νλ€λ 곡ν΅μ μ΄ μμ§λ§, λμ μ κΈ λμ μΈ‘λ©΄μμ μ°¨μ΄μ μ΄ μλ€. LinkedBlockingDequeλ μ κΈ λ©μ»€λμ¦μ μ¬μ©νμ¬ ν λ²μ λ¨μΌ μ€λ λμμλ§ λ°μ΄ν°λ₯Ό μλν μ μλλ‘ ν λ μ¬μ©νλ€. ConcurrentLinkedDequeλ κ°κ°μ μ€λ λκ° κ³΅μ λ°μ΄ν°μ μ‘μΈμ€ ν μ μλλ‘ ν λ μ¬μ©νλ€. λν λ°μ΄ν°λ₯Ό μλν λ μ±λ₯μ μν₯μ λ―ΈμΉ μ μλ€λ μ°¨μ΄μ μ΄ μλ€.
κ²°λ‘
λλΆλΆμ μν©μμλ Deque μ μ¬μ©ν λ LinkedList 보λ€λ ArrayDeque μ μ¬μ©νλ©΄ λλ€. λν λ©ν°μ€λ λ νκ²½μμ λ¨μΌμ€λ λλ₯Ό μ¬μ©ν κ³νμ΄λΌλ©΄ LinkedBlockingDequeλ₯Ό μ¬μ©νκ³ λ©ν°μ€λ λλ₯Ό μ¬μ©ν κ³νμ΄λΌλ©΄ ConcurrentLinkedDequeλ₯Ό μ¬μ©νλ©΄ λλ€.
μ°Έκ³
- Java 7 Stack μ€λΌν΄ λ¬Έμ
- Java 7 Deque μ€λΌν΄ λ¬Έμ
- [Java] μλ£κ΅¬μ‘° & μ λ ₯ API
- Thread Safe LIFO Data
- μλ° Deque λ μ€ν
- μλ°μμ Vector μ Stack 컬λ μ μ΄ μ¬μ©λμ§ μλ μ΄μ
- ConcurrentLinkedDeque vs LinkedBlockingDeque
- Decorator ν¨ν΄(synchronizedListμ ꡬν ν¨ν΄)
- ArrayDeque μ μ΄κΈ° μ©λ μ€μ
- μλ°μ μ μ 3rd Edition