숑숑이의 개발일기

본글은 'Do it 자바 완전 정복' 책을 통한 공부내용을 정리한 글입니다.

 

Stack<E> 컬렉션의 특징

Stack<E> 컬렉션은 17장에서 다루는 5개 컬렉션 중 유일하게 클래스다. 즉, 자체적으로 객체를 생성할 수 있다. 상속 구조를 살펴보면 List<E> 컬렉션의 구현 클래스인 Vector<E> 클래스의 자식 클래스로 후입선출(LIFO: last in first out)자료구조를 구현한 컬렉션이다.

 

당연히 Vector<E>의 모든 기능을 포함하고 있으며, 여기서 추가로 LIFO 구조를 위한 5개의 메서드가 추가됐다. 이 추가 메서드는 Stack<E> 클래스에서 추가됐으므로 사용하려면 변수를 Stack<E> 타입으로 선언해야 한다.

 

Stack<E>의 주요 메서드

구분 리턴 타입 메서드명 기능
데이터 추가 E push(E item) 매개변수의 item을 Stack<E>에 추가
데이터 확인 E peek() 가장 상위에 있는 원솟값 리턴(데이터는 변화 없음)
데이터 위치 검색 int search(Object o) Stack 원소의 위칫값을 리턴(맨 위의 값이 1, 아래로 내려갈 수록 1씩 증가)
데이터 추출 E pop() 최상위 데이터 꺼내기
(데이터의 개수 감소)
empty 여부 검사 boolean empty() Stack<E> 객체가 비어 있는지 여부를 리턴

주의해야 할 점은 Stack<E>는 Vector<E>의 자식 클래스이므로 Vector<E>에 포함되어 있는 add() 메서드나 remove() 메서드로도 데이터를 추가할 수 있다.다만 Vector<E>의 메서드를 사용시에는 LIFO 특성이 반영되지 않는다.

 

import java.util.*

public class StackMethod {
	public static void main(String[] args) {
    	Stack<Integer> = new Stack<Integer>();
        
        // 1. E push(e element)
        // 매개변수의 item을 Stack<E>에 추가
        stack.push(2);
        stack.push(5);
        stack.push(3);
        stack.push(7);
        
        // 2. E peek()
        // 최상위 데이터 리턴 (데이터 변화 x)
        System.out.println(stack.peek());	// 7
        System.out.println(stack.size());	// 4
        
        // 3. search(Object o)
        // 매개변수에 해당하는 Stack 원소의 위칫값을 리턴.
        System.out.println(stack.search(7));	// 1
        System.out.println(stack.search(3));	// 2
        System.out.println(stack.search(5));	// 3
        System.out.println(stack.search(2));	// 4
        System.out.println(stack.search(9));	// -1
        
        // 4. E pop()
        // 최상위 데이터 리턴 (데이터 변화 o)
        System.out.println(stack.pop());	// 7
        System.out.println(stack.pop());	// 3
        System.out.println(stack.pop());	// 5
        System.out.println(stack.pop());	// 2
        
        // 5. boolean empty()
        // 해당 객체가 비어있는지 리턴
        System.out.println(stack.empty());	// true
    }
}

 

Queue<E> 컬렉션의 특징

Queue<E> 인터페이스는 List<E>와 Set<E> 처럼 Collection<E>에게서 상속된 인터페이스로 앞에서 배운 LinkedList<E>가 Queue<E> 인터페이스를 구현하고 있다.

Queue<E>의 가장 큰 특징은 선입선출(FIFO: first in first out) 구조를 가진다는 것이다. 즉, 먼저 저장된 데이터가 먼저 출력되며 대표적인 예로는 이벤트를 처리하는 이벤트 큐를 들 수 있다.

 

Queue<E>의 주요 메서드

Queue<E> 내에 FIFO 기능을 부여하는 메서드는 2쌍으로, 차이점은 데이터가 없을 때 예외를 발생시키느냐 기본값(null)으로 대체하느냐다. 당연히 기본값으로 대체하는 것이 훨 안전할 것이다.

구분 리턴타입 메서드명 기능
예외 처리 기능
미포함 메서드
데이터 추가 boolean add(E item) 매개변수의 item을 Queue에 추가
데이터 확인 E element() 가장 상위에있는 원솟값 리턴(데이터 변화x)
- 데이터가 하나도 없을때 NoSuchElementException 발생
데이터 추출 E remove() 가장 상위에 있는 원솟값을 꺼냄 (데이터 변화o)
- 꺼낼 데이터가 하나도 없을 때 NoSuchElementException 발생
예외 처리 기능
포함 메서드
데이터 추가 boolean offer(E item) 매개변수의 item을 Queue에 추가
데이터 확인 E peek() 가장 상위에 있는 원솟값 리턴(데이터 변화x)
- 데이터가 하나도 없을 때 null 리턴
데이터 추출 E poll() 가장 상위에 있는 원솟값을 꺼냄
- 꺼낼 데이터가없을 때 null 리턴

예외 처리만 잘 하면 어떤 메서드를 사용해도 무방하지만, 가능한 예외 처리 기능이 포함된 메서드를 사용하기를 권고한다.

import java.util.*;

public class QueueMethod {
	public static void main(String[] args) {
    	Queue<Integer> queue1 = new LinkedList<Integer>();
        
        // 1-1. add(E item)
        // 매개변수의 item을 Queue에 추가
        queue1.add(3);
        queue1.add(4);
        queue1.add(5);
        
        // 1-2. element()
        // 가장 상위의 데이터 반환 (데이터 변화x)
        System.out.println(queue1.element());
        
        // 1-3. E remove()
        // 가장 상위의 데이터 반환 (데이터 변화o)
        System.out.println(queue1.remove());
        System.out.println(queue1.remove());
        System.out.println(queue1.remove());
        // System.out.println(queue1.remove()); 꺼낼 데이터가 없어 NoSuchElementException
        
        Queue<Integer> queue2 = new LinkedList<Integer>();
        System.out.println(queue1.peek());	// null
        
        // 2-1. offer(E item)
        // 매개변수의 item을 Queue에 추가
        queue2.offer(3);
        queue2.offer(4);
        queue2.offer(5);
        
        // 2-2. E peek()
        // 가장 상위의 데이터 반환 (데이터 변화x)
        System.out.println(queue2.peek());	// 3
        
        // 2-3. E poll()
        // 가장 상위의 데이터 반환 (데이터 변화o)
        System.out.pritnln(queue2.poll());	// 3
        System.out.pritnln(queue2.poll());	// 4		
        System.out.pritnln(queue2.poll());	// 5
        System.out.pritnln(queue2.poll());	//	null
        
    }
}
profile

숑숑이의 개발일기

@숑숑-

풀스택 개발자 준비중입니다