스택은 후입선출이라는 개념을 가지는 선형자료구조이다. 즉, 데이터의 삭제와 삽입이료구조이다. 즉, 데이터의 삭제와 삽입이 가장 끝이자 위에서만 일어난다. 가장 최근에 들어간 데이터가 나오는 개념의 자료구조로써, 브라우저의 뒤로가기, 수식 괄호 검사등에 사용된다.
자바에서는 stack메모리는 각 메서드 단위로 프레임이라는 것을 생성해서 stack을 이용한다.
출처: https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EB%B3%B4%EB%8A%94-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD%EC%8A%A4%ED%83%9D-%ED%9E%99
각 메서드가 실행될 때, 위처럼 스택 프레임이 생성되는데 이 내부에 매개 변수,지역변수가 생선된다.
위에서 Method
즉 static
영역은 JVM이 클래스를 로드할 때 저장 되는 공간으로, 클래스와 클래스 내의 멤버변수, 메서드가 저장된다.
그러나 Reference Type은 메모리의 주소 값만 stack에 두고 데이터는 heap에 둔다.
자바에서의 stack은 stack라이브러리를 통해서 다음과 같이 구현가능하다
Stack stack=new Stack();
System.out.println(stack.get(2));
그러나 여기에도 보다 싶이 stack이 vector를 상속받아서 위처럼 index의 값을 통해서 접근이 가능하다.
이것은 스택의 원래 취지와 다르게 사용될 수 있는 가능성을 제공한다.
또한 Vector는 Synchronized
되어 있어서 멀티 쓰레드 환경에더는 동기화된 작업환경을 제공하여 데이터의 무결성을 제공한다. 하지만 단일 쓰레드라면 단순하게 성능저하를 불러일으킬 수 밖애 없다.(락을 걸어서 다른 쪽에 접근을 못하게 하니까, 락을 걸고, 해제할 때의 시간이 포함되기 때문이다.)
따라서 자바에서 제공하는 아래와 같이 Deque를 구현하는 것이 나은 것이다.
Deque<Integer> deque = new ArrayDeque<>();
que를 사용할 때는 ArrayDeque에서 offer와 poll메서드를 이용하고 stack을 이용할 때는 push,pop메서드를 이용하면 된다.
중요한 내용이네요