본문 바로가기
야놀자 테크스쿨/JAVA 자료구조

[JAVA][자료구조] Java에서 Stack을 사용하는 방법 대해 알아보자!

by 노잼인간이라불립니다 2023. 7. 17.

0. 개요

 코딩테스트를 준비하면서 Stack이라는 자료구조를 사용하게 되었는데, Java에서는 어떠한 형식으로 Stack을 사용할 수 있게 제공해주는지, 어떤 메서드를 제공해주는지 정리하고자 이 글을 작성한다.

 

1. Java에서 제공해주는 Stack

 Queue와는 다르게 Java에서 Stack은 클래스로 구현이 되어 사용할 수 있게 제공해준다.

 잠깐 예전에 정리했던 Queue에 대해서 복기를 해보자면, Queue 같은 경우 new LinkedList()를 통해 생성하여 인터페이스에 해당하는 메소드를 사용했지만, Stack같은 경우 new Stack()으로 객체를 생성하여 스택을 사용할 수 있다!!

 Stack은 Vector를 상속받아서 구현되어 있는 것을 아래 사진을 통해 확인할 수 있다. 그리고 초록색으로 된 문장을 번역해보면 다음과 같다.

"Stack 클래스는 개체의 후입선출(LIFO) 스택을 나타냅니다. 벡터를 스택으로 처리할 수 있는 다섯 가지 작업으로 Vector 클래스를 확장합니다. 일반적인 푸시 및 팝 작업은 물론 스택의 맨 위 항목을 엿보는 방법, 스택이 비어 있는지 테스트하는 방법, 스택에서 항목을 검색하고 얼마나 멀리 있는지 확인하는 방법이 제공됩니다. 정상에서입니다.
스택이 처음 생성되면 항목이 포함되지 않습니다.
보다 완전하고 일관된 LIFO 스택 작업 세트는 이 클래스보다 우선적으로 사용해야 하는 Deque 인터페이스 및 해당 구현에 의해 제공됩니다. 예를 들어:
  Deque<Integer> 스택 = new ArrayDeque<Integer>();"

 내가 알기로는 Deque를 쓰면 앞과 뒤에 있는 데이터를 삽입 삭제시 List보다 성능이 훨씬 높다고 하는데, 나중에 한번 Deque를 사용할 문제가 발생하면 정리를 해야겠다.

 

 자 이제 내용들을 살펴봤다면 본격적으로 Stack 클래스가 제공하는 메서드는 어떤 것이 있는지 살펴보자.

 

1) push()

역시 Stack 하면 기본이 푸시와 팝이다. 초록색으로 된 문장을 번역하면 다음과 같다.

"이 스택의 맨 위로 항목을 푸시합니다."

처음엔 역시 데이터를 넣는 메서드이다. Queue와 비교하자면 add() 또는 offer()와 같은 기능과 비슷하다.

 

 

2) pop()

 pop 메서드를 살펴보면 제일 먼저 눈에 들어오는 것이 있을 것이다! 바로 synchronized가 앞에 붙어있다! 왜 synchronized가 붙어있는지 검색해보니 스레드 세이프하게 하기 위해서 push 메서드를 제외한 검색, 삭제등의 메서드에 동기화 키워드가 붙어 있는 것이라고 한다.

 그리고 초록색 글씨를 번역해보면 다음과 같다.

"이 스택의 맨 위에 있는 개체를 제거하고 해당 개체를 이 함수의 값으로 반환합니다."

즉 가장 최근에 스택에 저장된 데이터를 꺼내서 리턴해주는 셈이다. Queue와 비교해보자면 poll() 또는 remove()의 기능과 비슷하다.

 

3) peek()

 Queue에서 제공하는 메서드와 이름이 똑같다! 기능도 비슷하다! 그럼 초록색 문장을 번역하여 살펴보자!

"스택에서 개체를 제거하지 않고 이 스택의 맨 위에 있는 개체를 봅니다."

기능을 살펴보니 다음번에 pop할 데이터를 살펴보는 메서드이다. queue와 동일하다.

 

4) empty()

 이름만 봐도 이 스택이 비어있는지 확인하는 메서드 같다. 초록색 문장을 번역해서 확인해보자!

"이 스택이 비어 있는지 테스트합니다."

예상과 일치했다! Stack에 데이터가 있는지 없는지 확인할 때 아주 유용해 보인다! (다음 풀 알고리즘 문제에 바로 써 먹을듯하다)

 

5) search()

 이름만 봤을 때는 뭔가 검색? 찾는 메서드인거 같은데, 초록색 문장을 번역해서 확인해보자!

"객체가 이 스택에 있는 1 기반 위치를 반환합니다. 개체 o가 이 스택의 항목으로 발생하는 경우 이 메서드는 스택 상단에서 가장 가까운 항목의 스택 상단에서 거리를 반환합니다. 스택의 맨 위 항목은 거리 1에 있는 것으로 간주됩니다. equals 메서드는 o를 이 스택의 항목과 비교하는 데 사용됩니다."

 번역문만 봤을 때는 일부만 이해되는 느낌이다. 다시 한번 문장을 살펴보면, 일단 opject를 매개변수로 전달하게 되면, 그 object가 stack에서 몇 번째에 존재하는지 거리를 리턴해주는 메서드 인 것 같다. 만약 스택에서 제일 위에 존재한다면 거리는 1이 리턴된다고 한다. 그래서 1-based position이라는 단어를 쓴 모양이다.

 정리하자면 스택에 존재하는 오브젝트의 스택에서의 위치, 즉 몇 번째에 위치하는지 알려주는 메서드이다. 말 그래도 객체를 검색한다.

 

 

2. 정리

이렇게 Java에서 제공해주는 Stack에 대한 메서드들을 살펴봤다. 다시 한번 간단하게 정리해보면,

 1) push() : 스택에 데이터를 넣는다.

 2) pop() : 스택에서 최상단에 존재하는 데이터를 꺼낸다.

 3) peek(): 스택에서 최상단에 존재하는 데이터를 살펴본다.

 4) empty(): 스택에 비어있는지 확인한다.

 5) search(): 스택에 존재하는 object가 몇 번째에 있는지 확인한다.(최상단 오브젝트는 1을 리턴)(1 - based position 이다)