💡Stack Class
Stack 클래스는 한쪽이 막혀있는 파이프 구조를 떠올리면 된다.
후입선출 방식(LIFO, Last Input First Output)으로, 저장소에 나중에 들어간 요소가 가장 먼저 나온다.
Stack을 활용한 예로는 되돌리기(Ctrl + Z), 다시하기(Ctrl + Y) 기능이 있다.
데이터를 넣을 때에는 Push Down, 데이터를 꺼낼 때에는 Pop Up이라는 표현을 쓴다.
Stack 클래스의 활용
Stack 선언하기
Stack<String> stack = new Stack<String>();
제네릭의 타입 변수를 사용하여 Stack 배열을 생성해준다.
요소 추가하기
T push(T value)
stack.push("짜장면");
stack.push("짬뽕");
stack.push("볶음밥");
Stack 클래스에서 데이터를 추가할 때에는 push() 메소드를 사용한다.
요소 개수 확인하기
int size()
System.out.println(stack.size()); // 3
요소 읽기 (꺼내기)
System.out.println(stack.pop()); // 볶음밥
System.out.println(stack.size()); // 2
System.out.println(stack.pop()); // 짬뽕
System.out.println(stack.size()); // 1
System.out.println(stack.pop()); // 짜장면
System.out.println(stack.size()); // 0
// System.out.println(stack.pop()); // EmptyStackException
System.out.println(stack.size());
Stack 클래스에서 데이터를 꺼낼 때에는 pop() 메소드를 사용하며, 마지막에 넣은 데이터부터 순차적으로 다시 꺼낸다.
pop() 메소드는 데이터를 읽음과 동시에 꺼낸다는 특징이 있다. 그래서 메소드를 호출하면 배열의 길이가 줄어든다.
만약 더 이상 꺼낼 데이터가 없는데 데이터를 꺼내려고 하면 EmptyStackException 오류가 발생한다.
요소 확인하기
System.out.println(stack.peek());
pop() 메소드와 peek() 메소드는 요소를 읽는다는 점에서 비슷하지만 차이점이 있다.
peek() 메소드는 데이터를 읽기만 하고 꺼내지 않는다. 이를 다르게 말하면 파이프의 뚫린 구멍쪽에서 구경만 하는 메소드라고 할 수 있겠다.
스택이 비었는지 확인하기
if (stack.size() != 0) {
System.out.println(stack.pop());
}
if (!stack.isEmpty()) {
System.out.println(stack.pop());
}
꺼낼 데이터가 없는데 데이터를 꺼내려고 하면 오류가 발생하므로, 스택이 비었는지를 확인하며 pop() 메소드를 호출할 수 있도록 하는 게 좋다.
💡Queue Interface
Queue 인터페이스는 양쪽이 뚫려있는 파이프 구조를 떠올리면 된다.
선입선출 방식(FIFO, First Input First Output)으로, 저장소에 먼저 들어간 요소가 가장 먼저 나온다.
Queue을 활용한 예시로는 입력을 하자마자 바로 출력되는 마우스와 키보드가 있다.
Queue 인터페이스의 활용
Queue 선언하기
// Queue<String> queue = new Queue<String>();
Queue<String> queue = new LinkedList<String>();
자바는 Queue를 Class가 아닌 Interface로 인식한다. 따라서 Queue는 껍데기이며, LinkedList로 본체를 생성해야 한다.
요소 추가하기
boolean add(T value)
queue.add("커피");
queue.add("에이드");
queue.add("라테");
Queue 인터페이스에서 데이터를 추가할 때에는 add() 메소드를 사용한다.
요소 읽기 (꺼내기)
System.out.println(queue.poll()); // 커피
System.out.println(queue.size()); // 2
System.out.println(queue.poll()); // 에이드
System.out.println(queue.size()); // 1
System.out.println(queue.poll()); // 라테
System.out.println(queue.size()); // 0
System.out.println(queue.poll()); // null
Queue 인터페이스에서 요소를 읽을 때에는 poll() 메소드를 사용하며, 데이터를 넣은 순서로 출력한다.
Stack 클래스의 pop() 메소드와 같이 요소를 읽음과 동시에 꺼낸다.
요소 확인하기
System.out.println(queue.peek()); // 커피
Queue 인터페이스에서 요소를 확인할 때에는 Stack 클래스와 같이 peek() 메소드를 사용한다.
이때, 배열의 가장 처음에 있는 데이터를 출력한다.
요소 개수 확인하기
int size()
System.out.println(queue.size()); // 3
스택이 비었는지 확인
if (queue.size() != 0) {
System.out.println(queue.poll());
}
if (!queue.isEmpty()) {
System.out.println(queue.poll());
}
더이상 꺼낼 데이터가 없더라도 Queue 인터페이스는 Stack 클래스와 달리 오류가 발생하지 않는다.
하지만 연결된 기능에서의 오류를 피하기 위해 스택이 비어있지 않을 때에만 요소를 읽는 것이 좋다.