최초 작성일(yy/mm/dd): 24/01/07 최초 작성
Fig 1. Java.util.Stack의 상속 순서와 설명 |
---|
![]() |
출처: docs.oracle.com |
Fig 2. java.util.Stack이 상속받은 메소드 |
---|
![]() |
출처: docs.oracle.com |
특히 Vector에서 직접적으로 상속된 메소드가 많다는 점이 눈에 띕니다. 따라서 스택 클래스와 관련해서는 Vector를 유심히 살펴봐야 합니다.
스택 클래스의 단점
문서 마지막에서는 스택 클래스를 사용하는 개선된 방식으로 ArrayDeque의 이용을 권장합니다. 이는 Vector 클래스가 가진 결점 때문입니다.
배열과 같은 방식으로 접근되고 사용될 수 있음
Random Access 방식의 접근은 물론, add와 같은 메소드 역시 특정 인덱스에 요소를 추가할 수 있다는 점에서 스택이 가진 구조와 배치됩니다.
Fig 3. java.util.Stack의 기본 메소드 |
---|
![]() |
출처: docs.oracle.com |
일례로, search 메소드가 대표적입니다. 스택 자료구조에서 Random Access 방식의 search는 어울리지 않습니다.
또한, 락 오버헤드(Lock Overhead)로 인한 비용으로 성능 역시 저하됩니다.
자바에서 스택 이용
Deque<E> stack = new ArrayDeque<E>();
Vector에서 비롯된 Stack의 문제점이 개선되었고, search() 메소드는 이용할 수 없습니다.
그러나 Problem Solving에서 search() 메소드가 급히 필요하거나 구현 시간이 부족하다면, 권장되지 않겠지만 Stack 클래스를 이용할 수 있지 않을까요?
Postfix/Prefix conversion
되돌아가기 및 취소(Redo-undo) 기능
스택 메모리
지역 변수, 매개 변수, 반환 주소(return address)가 저장되는 메모리입니다. 주로 primitive type의 지역변수, 매개변수가 저장됩니다.
↔ 전역 변수는 Static 메모리에 저장됩니다.
문자열 역순
함수 호출
메소드가 호출되면 필요한 크기만큼 메모리를 할당받고, 수행이 끝나면 메모리를 반환합니다. 최상단 메소드가 실행중인 메소드이며, 스택의 bottom-up 순서는 호출된 순서입니다.
⇒ Problem Solving만이 아니라, JVM이나 메모리 구조와 관련된 주제도 많다는 점이 보입니다.