Stack과 Queue 이해하기
Stack이란?
Stakc은 클래스의 한 종류이며 책을 쌓아 올리는 것처럼 자료를 쌓아 올리는 구조입니다. 이러한 방식을 LIFO이라고 표현하기도 합니다. Last In First Out의 첫 글자를 딴 것으로 자료를 꺼낼 때 최근에 입력한 것부터 꺼내지는 것을 의미합니다.
push() | 주어진 객체를 스택에 넣습니다. |
peek() | 남아있는 객채 중 가장 최근에 저장한 객채를 불러옵니다. |
pop() | 남아있는 객채 중 가장 최근의 객체를 불러오고 스택에서 제거합니다. |
주로 사용하는 메서드는 위의 3가지입니다. peek의 경우는 제일 위에 쌓인 자료가 무엇인지 확인을 하기 위한 메서드이고 pop의 경우는 제일 위의 자료를 가져오며 스택에서 제거하게 됩니다.
Stack name = new Stack();
name.push(50);
name.push("안녕");
name.push(5.3);
System.out.println(name.peek().getClass().getSimpleName()); //Integer 출력
System.out.println(name.pop()); // 5.3 출력
System.out.println(name.peek().getClass().getSimpleName()); // String 출력
System.out.println(name.pop()); // 안녕 출력
System.out.println(name.peek().getClass().getSimpleName()); // Double 출력
System.out.println(name.pop()); // 50 출력
위의 예시는 Stack을 선언하는 방법과 메서드를 사용하는 방법을 보인 예시입니다. name이라는 Stack을 선언하고 push를 통하여 값을 넣어줍니다. 자료형에 구분 없이 쌓아 올리기 때문에 int, String, double의 자료를 넣어도 문제가 생기지 않습니다. 자료를 순서대로 넣고 난 뒤 peek을 통하여 자료를 확인하여 getClass와 getSimpleName을 통하여 자료형을 출력해 보고 pop을 통하여 자료를 출력하고 제거하는 과정을 반복하면 마지막에 넣은 자료부터 처음 넣은 자료 순서로 출력되는 것을 볼 수 있습니다.
Queue란?
Queue란 인터페이스이며 Stack과 다르게 먼저 입력된 자료부터 꺼내는 방식의 FIFO의 방식입니다. 즉 대기열을 생각하시면 편하실 것 같습니다. 먼저 줄을 선 사람이 먼저 기회를 얻는 것처럼 먼저 넣은 자료가 먼저 나오게 됩니다.
offer() | 주어진 객체를 입력합니다 |
peek() | 남아있는 객체 중 가장 먼저 입력된 객체를 가져옵니다. |
poll() | 남아있는 객체 중 가장 먼저 입력된 객체를 가져오고 큐에서 제거합니다. |
주로 사용하는 메서드는 위의 3가지입니다. peek의 경우는 제일 먼저 입력된 자료가 무엇인지 확인을 하기 위한 메서드이고 poll의 경우는 제일 먼저 입력된 자료를 가져오며 스택에서 제거하게 됩니다.
Queue name = new LinkedList();
name.offer(50);
name.offer("안녕");
name.offer(5.3);
System.out.println(name.peek().getClass().getSimpleName()); // Integer 출력
System.out.println(name.poll()); // 50 출력
System.out.println(name.peek().getClass().getSimpleName()); // String 출력
System.out.println(name.poll()); // 안녕 출력
System.out.println(name.peek().getClass().getSimpleName()); // Double 출력
System.out.println(name.poll()); // 5.3 출력
Queue의 경우는 인터페이스이기 때문에 직접 인스턴스화 할 수 없습니다. 따라서 Queue를 구현한 LinkedList를 통하여 인터페이스 하거나 다른 클래스를 이용하여 인스턴스화 하여야 합니다. name이라는 이름의 LinkedList를 Queue를 통하여 선언을 하고 offer를 이용하여 자료를 입력합니다. 출력은 위의 Stack예시와 마찬가지로 출력할 자료의 자료형을 출력하고 그다음 자료를 출력하는 순서로 peek을 이용하여 자료형을 불러오고 getClass와 getSimpleName으로 자료형을 구합니다. poll을 이용하여 자료를 가져오고 Queue에서 제거하게 됩니다. Stack과는 다르게 먼저 입력한 자료부터 입력 순서대로 값이 출력되는 것을 볼 수 있습니다.
Deque란?
Deque는 앞과 뒤 어느 방향으로든 자료를 입력하고 출력할 수 있습니다. Queue와 마찬가지로 인터페이스로 구현되어있어서 이를 구현한 ArrayDeque, LinkedBlockingDeque, ConcurrentLinkedDeque, LinkedList 등을 이용하여 인스턴스화 할 수 있습니다.
offerFirst() | Deque의 앞쪽에 자료를 입력합니다. 입력되면 true가 리턴되고 제한되면 false를 리턴합니다. |
offerLast() | Deque의 뒷쪽에 자료를 입력합니다. 입력되면 true가 리턴되고 제한되면 false를 리턴합니다. |
addFirst() | Deque의 앞쪽에 자료를 입력합니다. 용량을 초과하면 예외가 발생합니다. |
addLast() | Deque의 뒷쪽에 자료를 입력합니다. 용량을 초과하면 예외가 발생합니다. |
peekFirst() | Deque의 앞쪽의 자료를 가져옵니다. Deque가 비어있으면 null을 반환합니다. |
peekLast() | Deque의 뒷쪽의 자료를 가져옵니다. Deque가 비어있으면 null을 반환합니다. |
getFirst() | Deque의 앞쪽의 자료를 가져옵니다. Deque가 비어있으면 예외가 발생합니다. |
getLast() | Deque의 앞쪽의 자료를 가져옵니다. Deque가 비어있으면 예외가 발생합니다. |
pollFirst() | Deque의 뒤쪽의 자료를 가져오고 제거합니다. Deque가 비어있으면 null을 반환합니다. |
pollLast() | Deque의 앞쪽의 자료를 가져오고 제거합니다. Deque가 비어있으면 null을 반환합니다. |
removeFirsr() | Deque의 뒤쪽의 자료를 가져오고 제거합니다. Deque가 비어있으면 예외가 발생합니다. |
removeLast() | Deque의 뒤쪽의 자료를 가져오고 제거합니다. Deque가 비어있으면 예외가 발생합니다. |
입력의 위치와 예외가 발생하는지 값을 반환하는지 상황에 따라 필요로 하는 메서드를 사용할 수 있으므로 활용도가 높습니다.
System.out.println(name.offerFirst(50)); //true출력
name.offerFirst("안녕");
name.offerLast(5.3);
System.out.println(name.peekFirst().getClass().getSimpleName()); // String 출력
System.out.println(name.pollFirst()); // 안녕 출력
System.out.println(name.peekFirst().getClass().getSimpleName()); // Integer 출력
System.out.println(name.pollFirst()); // 50 출력
System.out.println(name.peekFirst().getClass().getSimpleName()); // Double 출력
System.out.println(name.pollFirst()); // 5.3 출력
System.out.println(name.pollFirst()); // null 출력
입력은 50, 안녕, 5.3 순서로 입력하였지만 50과 안녕은 앞으로 넣었고 5.3은 뒤로 넣었으므로 (앞) 안녕, 50, 5.3 (뒤) 순서로 자료가 저장되어 있습니다. 따라서 앞에서부터 peek을 사용하고 poll을 사용하게 되면 안녕, 50, 5.3 순서로 출력이 되고 마지막에 저장된 자료가 없음으로 null을 출력합니다.