2012년 10월 29일 월요일

자바의 스택(Stack)


java.util 팩키지에 있는 자바의 스택(Stack)에 대해서 공부해 보기로 하자. 스텍은 벡터를 상속받고 있으며 기본적으로 5가지의 기능과 함께 벡터를 스택으로 대체해 쓰는게 가능하다. 스택은 LIFO(Last-In-First-Out)로 표시하곤 하는데 그림에서 보다시피 나중에 들어간 아이템이 가장 먼저 나온다는 원리이다.


스택은 방금 언급했다시피 총 5가지의 메소드를 지원한다. 몇개 안되니 아래에 써보기로 하겠다.

boolean empty( )
int search(Object o)
E push( E item)
E pop( )
E peek( )

위의 기능들을 한문장으로 정리하자면 비어있는지 확인하고 안에 특정 요소가 있는지 살펴보고 요소를 넣고 빼고 뭐가 있는지 살짝 보는게 위의 5가지 메소드들이 하는 일이다.^^ 예제를 보면서 어떻게 작동되는지 실험해 보기로 하자.


오늘 코딩할 예제는 위와 같다. 기본적으로 5개의 요소들을 집어넣은 상태에서 pop( ) 메소드를 이용해 가장 나중에 넣은 요소 12를 꺼내고 다음에 새로운 요소 83을 넣는 예제이다. 그림만 봐도 이해가 될것이다. 스택을 사용할때는 위와같은 형태의 구조를 떠올리면 쓰기 쉬울 것이다.^^ 그럼 예제 코드를 보기로 하자.


true
false
[17, 5, 123, 25, 12]
=== 강이의 JAVA강좌 ===
12
[17, 5, 123, 25]
[17, 5, 123, 25, 83]
4
=== 강이의 자바강좌 ===

스택의 5가지 기능을 모두 넣어 예제를 구성하였으니 본 예제 하나로 스택의 기능들이 어떤게 있는지 다 알아볼수 있을 것이다.ㅎㅎ 많은 이들이 스택에 관련된 질문중에서 자주 틀리는 부분이 한가지 있다. 오늘 그 중요한 맥을 필자가 짚어줄 것이니 끝까지 예제에 집중해주기 바란다.^^

예제를 보면 그림처럼 스택에다가 관련 숫자들 5개를 for 구문을 통해 처음에 넣는다. 넣기전에 empty( ) 메소드를 이용해서 스택이 비어있는지 물어보니까 비어있어서 true라고 찍힌 것이다. 숫자들을 다 넣은후에 다시 물어봤더니 스택이 이제 차 있으니까 false라고 찍혔다. 그리고 관련 요소들을 출력하라고 하니 스택에 있는 요소들을 쭈욱 찍은 것이다. 화면상에는 결과에서처럼 옆으로 나열되어서 숫자들이 찍히지만 여러분은 위의 예제 그림처럼 숫자들이 들어있다고 생각하기 바란다.^^

그 다음에 peek( ) 메소드를 이용해 가장 위에 있는 요소를 살짝 엿보고 찍으라고만 하니 12가 찍힌 것이고 다음에 pop( ) 메소드를 실행하였다. 이 메소드가 하는 일은 스택에서 맨 상위 요소를 하나 꺼내는 것이다. 그래서 요소 12가 제거되고 난 후의 요소들 4개가 찍힌 것이고 push( ) 메소드를 이용해 83을 넣으니 스택에 총 5개의 요소들이 찍혔다.ㅎㅎ 여기까지는 여러분이 생각하는 그대로일거다. 오늘의 하이라이트인 마지막 출력 부분에 4라는 숫자가 찍혔다. 이 부분에서 막히는 이들이 많을 것인데 스택에서 가장 헤깔려하는 부분이므로 확실히 알고 넘어가기 바란다.ㅎㅎ

search( ) 메소드를 이용해서 관련요소 5를 찾으라고 했는데 아마 대다수가 1이 찍힐거라고 예상했을 것이다. 그것도 아니라면 2가 찍혀야 정답의 근사치가 아닐까 생각할텐데 이런 부분 때문에 특히 스택을 예제의 그림처럼 항시 생각해야 편한 것이다. 스택에서는 해당 요소를 찾으라고 검색할 경우 스택의 위쪽에서부터 카운트를 한다. 카운트도 가장 최상위의 아이템을 1로 잡고 카운트한다. 따라서 우리가 찾는 요소 5 위에 세개의 요소가 더 있으니 맨 위를 1로 잡고 아래로 세어 나가다보면 요소 5가 있는 위치가 4가 됨을 알수 있을 것이다. 이렇게 1부터 기본적으로 세어나간다고 해서 이를 1-based position이라고 표현한다.^^

자바뿐만 아니라 Data Structure에 관계된 프로그래밍을 공부할때 항상 빠지지 않고 등장하는 것중에 하나가 스택이니 어떤 것인지 머리속에 정리해 두기 바라면서 스택 강의는 여기서 마치도록 하겠다.^^

댓글 1개: