κ°μ
μλ° Collection μΈν°νμ΄μ€λ₯Ό κΉκ² 곡λΆνκΈ° μ μ μ½λ© ν μ€νΈ λ¬Έμ μμ Stack μλ£κ΅¬μ‘°λ₯Ό μ¬μ©ν΄μ λ¬Έμ λ₯Ό νμ΄μΌν λ, μλ°μμ μ 곡ν΄μ£Όλ Stack ν΄λμ€λ₯Ό νμ©ν΄μ λ¬Έμ λ₯Ό νμλ€.
νμ§λ§, CSμ μλ£κ΅¬μ‘° λ° μλ° κ³΅λΆλ₯Ό κΉκ² ν΄λ³΄λ μ€λ¬΄μ μΈ νλ‘κ·Έλλ°μμ Stack ν΄λμ€μ Vector ν΄λμ€ νμ©μ μ§μν΄μΌνλ€λ κ±Έ νμ΅νκ² λλ€.
μ΄μ λ λ€μκ³Ό κ°λ€.
1. λΉν¨μ¨μ μΈ λκΈ°ν
Vectorμ Stackμ λͺ¨λ λκΈ°νλ(synchronized) ν΄λμ€μ΄λ€. μ΄λ λ©ν°μ€λ λ νκ²½μμ μμ νκ² μ¬μ©ν μ μλ€λ μ₯μ μ΄ μμΌλ, λΆνμν λκΈ°νλ‘ μΈν΄ μ±λ₯ μ νκ° λ°μν μ μλ€. λλΆλΆμ κ²½μ°, λκΈ°νκ° νμνμ§ μκΈ° λλ¬Έμ μ΄λ¬ν ν΄λμ€λ€μ μ¬μ©νλ κ²μ λΉν¨μ¨μ μ΄λ€. λμ , λΉλκΈ°νλ ArrayListμ Deque(ꡬν체λ‘λ ArrayDequeλ₯Ό λ§μ΄ μ¬μ©ν¨)λ₯Ό μ¬μ©νλ κ²μ΄ λ λ«λ€.
λ²‘ν° ν΄λμ€μ λ΄λΆ ꡬν
Vector ν΄λμ€μ λκΈ°νλ ν΄λμ€ λ΄μ κ±°μ λͺ¨λ λ©μλκ° synchronized ν€μλλ‘ λ³΄νΈλκΈ° λλ¬Έμ λ°μνλ€. μ΄λ Vectorμ λͺ¨λ λ©μλκ° λκΈ°νλ λΈλ‘ λ΄μμ μ€νλλ€λ κ²μ μλ―Ένλ©°, λμμ μ¬λ¬ μ€λ λκ° μ κ·Όν κ²½μ° μ€λ λ μμ μ±μ 보μ₯νμ§λ§, μ±λ₯ μ νλ₯Ό μ΄λνλ€.
λ¨μν Vectorμ Iteratorλ₯Ό λΆμ¬ μμ°¨μ μΌλ‘ itemλ€μ νμνκΈ°λ§ ν΄λ μμνμ μλ§λ€ get() λ©μλμ μ€νμ μν΄ κ³μ lockμ κ±Έκ³ λ«μΌλ―λ‘ Iteratorμ°μ°κ³Όμ μ 체μ 1λ²λ§ κ±Έμ΄μ£Όλ©΄ λ lockingμ μΈλ°μλ μ€λ²ν€λκ° μμ²λκ² λ°μνλ€.
λν λ¨μΌ μ€λ λ νκ²½μμ λκΈ°ν μ²λ¦¬λ λΆνμνκΈ° λλ¬Έμ λΆνμν μ€λ²ν€λκ° μκΈ΄λ€.
μ½λ© ν μ€νΈ λ¬Έμ νμ΄ λλ λ©ν° μ€λ λ© νκ²½μ΄ μλκΈ° λλ¬Έμ λ²‘ν° ν΄λμ€λ μ€ν ν΄λμ€λ₯Ό μ¬μ©νλ κ²μ λΆνμν μ€λ²ν€λλ₯Ό μΌκΈ°μν¨λ€.
μ€ν ν΄λμ€ λ΄λΆ ꡬν
μ€ν ν΄λμ€λ λ²‘ν° ν΄λμ€λ₯Ό μμλ°μ νμ₯λ ν΄λμ€μ΄λ€. μ€νμ λ©μλ λν λκΈ°ν μ²λ¦¬κ° λμ΄ μμ΄μ, λ²‘ν° ν΄λμ€ μ λκ°μ΄ λΆνμν μ€λ²ν€λλ₯Ό μΌκΈ°μν¨λ€.
2. λ λμ λμ μ‘΄μ¬
- Vector λμ ArrayList μ¬μ©: ArrayListλ Vectorμ κ±°μ λμΌν κΈ°λ₯μ μ 곡νμ§λ§, λκΈ°νλμ§ μμ λ κ°λ³κ³ λΉ λ₯΄λ€. λκΈ°νκ° νμν κ²½μ°μλ Collections.synchronizedList λ©μλλ₯Ό μ¬μ©νμ¬ ArrayListλ₯Ό λκΈ°νν μ μλ€.
List<Integer> synchronizedList = Collections.synchronizedList(new ArrayList<>());
- Stack λμ Deque μ¬μ©: Stack ν΄λμ€λ μ€λλ ν΄λμ€μ΄λ©°, λ μ μ°νκ³ κ°λ ₯ν Deque μΈν°νμ΄μ€(ꡬν체λ‘λ ArrayDeque, LinkedList λ±)λ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€. Dequeλ μ€νκ³Ό νμ κΈ°λ₯μ λͺ¨λ μ§μνλ©°, λ λμ μ±λ₯μ μ 곡νλ€.
μλ°μμ Dequeλ₯Ό ꡬννλ λ°©λ²μ ν¬κ² LinkedListμ ArrayDequeκ° μλλ°, μ€νμ sizeκ° μμ² μ»€μ§ κ°λ₯μ±μ΄ μκ³ sizeμ λ³λμ±μ΄ λ§€μ° ν° κ²½μ° μ¦κ°μ μΈ λ©λͺ¨λ¦¬ κ³΅κ° ν보λ₯Ό μν΄μ LinkedListλ°©μμ΄ μ μ νκ³ , κ·Έλ μ§ μμ κ²½μ°λ μ체 λ©λͺ¨λ¦¬ μλͺ¨λμ΄ μ κ³ iterateμ ν¨μ¨μ΄ μ’μ ArrayDequeλ₯Ό μ¬μ©νλ©΄ λλ€.
κ·Έ μΈ νΉμν μν©μ λ κ³ λ €ν΄λ³΄μλ©΄, λ©ν°μ€λ λ νκ²½μμλ java.util.concurrent ν¨ν€μ§μ ConcurrentLinkedDequeν΄λμ€λ₯Ό μ¬μ©νλκ² μ’κ³ (Non-blockingμ μ¬μ©νμ¬ λμ λμμ±μ μ 곡, ν΄λμ€λ λ΄λΆμ μΌλ‘ λ½μ μ¬μ©νμ§ μκ³ CAS(compare-and-swap) κ°μ μ μμ€ λκΈ°ν κΈ°λ²μ μ¬μ©νλ€.)
μ€νμ sizeκ° μ νλμ΄μλ κ²½μ°μ LinkedBlockingDeque ν΄λμ€(λΈλ‘νΉ νλ‘, νκ° κ°λ μ°¨κ±°λ λΉμ΄ μμ λ μ€λ λλ₯Ό μ°¨λ¨νμ¬ μμ ν λκΈ°νλ₯Ό μ 곡 νλ€.)λ₯Ό μ¬μ©νλ κ²μ κ³ λ €ν΄λ³Όλ§ νλ€.
Deque<Integer> stack = new ConcurrentLinkedDeque<>();
Deque<Integer> anotherStack = new LinkedBlockingDeque<>();
3. μ€κ³μμ λ¬Έμ
Stack ν΄λμ€λ Vectorλ₯Ό μμλ°μ ꡬνλμκΈ° λλ¬Έμ, μμμ ν΅ν μ½λ μ¬μ¬μ©μ΄λΌλ μΈ‘λ©΄μμ μ’μ μ€κ³κ° μλλ€. μ΄λ Liskov Substitution Principleμ μλ°νλ κ²½μ°κ° λ§μμ§λ€. Deque μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ€μ μ΄λ¬ν λ¬Έμ λ₯Ό νΌν μ μλλ‘ μ€κ³λμλ€.
Stack ν΄λμ€λ Vector ν΄λμ€λ₯Ό μμλ°μ ꡬνλμκΈ° λλ¬Έμ, Vectorμ λͺ¨λ λ©μλλ₯Ό μμλ°λλ€. μ΄λ Stack ν΄λμ€κ° Vector ν΄λμ€μ λ©μλλ₯Ό λΆνμνκ² λ§μ΄ κ°μ§κ² λ¨μ μλ―Ένλ€. μλ₯Ό λ€μ΄, Vector ν΄λμ€μλ insertElementAt, removeElementAt κ°μ λ©μλκ° μλλ°, μ΄λ¬ν λ©μλλ μ€νμ LIFO(Last In First Out) νΉμ±μ μ ν©νμ§ μλ€.
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.get(1)); // 2
stack.set(1, 99);
System.out.println(stack); // [1, 99, 3]
Vectorλ λλ€ μ‘μΈμ€λ₯Ό μ§μνκΈ° λλ¬Έμ Stack ν΄λμ€κ° μ΄λ₯Ό μμλ°μμ λ μ€νμ κΈ°λ³Έ μμΉ(LIFO)μ μλ°ν κ°λ₯μ±μ΄ μλ€. μ΄λ Liskov Substitution Principle(LSP)μ "μλΈνμ μ κΈ°λ° νμ μΌλ‘ λ체 κ°λ₯ν΄μΌ νλ€"λ μμΉμ μλ°νκ² λλ©°, Stack ν΄λμ€κ° μ’μ μ€κ³κ° μλμ λνλΈλ€. λ°λ©΄, Dequeλ μ€νκ³Ό νμ νΉμ±μ λͺ ννκ² μ μ§νλ©°, μΈλ±μ€λ₯Ό ν΅ν λλ€ μ‘μΈμ€λ₯Ό μ§μνμ§ μκΈ° λλ¬Έμ μ΄λ¬ν λ¬Έμ λ₯Ό νΌν μ μλ€. κ·Έλμ, μλ° νλ‘κ·Έλλ°μμ Stack λμ Dequeλ₯Ό μ¬μ©νλ κ²μ΄ λ°λμ§νλ€.
κ²°λ‘
μλ° νλ‘κ·Έλλ°μμ Vectorμ Stackμ μ§μν΄μΌ νλ μ΄μ λ λΉν¨μ¨μ μΈ λκΈ°ν, λ λμ λμμ μ‘΄μ¬, κ·Έλ¦¬κ³ μ€κ³μμ λ¬Έμ λ€ λλ¬Έμ΄λ€. μ΄λ¬ν μ΄μ λ‘, λ νλμ μΈ ArrayListμ Dequeλ₯Ό μ¬μ©νλ κ²μ΄ λ°λμ§νλ€.
λκΈ