본글은 '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
}
}
'Backend > JAVA' 카테고리의 다른 글
[Java] #19.1 자바 입출력 - 파일 관리와 문자셋 (0) | 2023.08.13 |
---|---|
[Java] #18 람다식 (0) | 2023.08.10 |
[JAVA] #17.4 Map<K, V> 컬렉션 인터페이스 (0) | 2023.07.20 |
[JAVA] #17.3 Set<E> 컬렉션 인터페이스 (0) | 2023.07.19 |
[JAVA] #17 컬렉션 프레임워크, List<E> 컬렉션 인터페이스 (1) | 2023.07.18 |