Intro. LIFO와 FIFO
LIFO는 후입선출, FIFO는 선입선출로 LIFO는 접시 쌓기, FIFO는 은행 번호표를 생각하면 이해하기 쉽다.
자바에서는 LIFO로 Stack 클래스를, FIFO로 Queue 인터페이스를 제공하고 있다.
스택은 push, pop, peek 메소드를 제공하고 큐는 offer, poll, peek 메소드를 제공한다.
Stack
Stack은 List 인터페이스를 구현한 클래스이다.
하지만 생성하는 방법은 List의 여느 구현클래스와 달리 Stack<> stack = new Stack<>();으로 선언한다.
복습) List 인터페이스를 구현하는 ArrayList는 List<> list = new ArrayList<>();으로 선언했음
Stack 클래스의 주요 메소드는 아래와 같다.
push(E item) : 주어진 객체를 스택에 넣는다.
pop( ) : 가장 마지막에 넣은 객체(=위에 있는 객체)를 제거하고, 해당 객체를 리턴한다.
peek( ) : 가장 마지막에 넣은 객체(=위에 있는 객체)를 리턴만 한다.
import java.util.*;
public class StackExample {
public static void main(String[] args) {
// Stack 생성
Stack<Coin> coinBox = new Stack<>();
// 객체 저장 - push
coinBox.push(new Coin(100));
coinBox.push(new Coin(500));
coinBox.push(new Coin(50));
// 저장된 갯수 - size
System.out.println("남은 동전 갯수는 "+coinBox.size()+"개");
// 객체 제거 - pop(가장 나중에 저장한 것부터 제거)
while(!coinBox.isEmpty()) {
Coin gone = coinBox.pop();
System.out.println(+gone.getValue()+"원 꺼내기");
}
// 50 - 500 - 100이 차례로 나온다.
System.out.println("남은 동전 갯수는 "+coinBox.size()+"개");
}
}
class Coin{
private int value;
Coin(int value){
this.value = value;
}
public int getValue() {
return value;
}
}
Queue
Queue는 Collection 인터페이스의 하위 인터페이스이다.
Queue 인터페이스를 구현한 대표적 클래스는 LinkedList이다.
따라서 Queue를 선언할 때 Queue<E> queue = new LinkedList< >( ); 라고 선언할 수도 있다.
Q. LinkedList는 List 인터페이스를 구현한 클래스 아닌가?🤔
A. 그것도 맞는 말이고, 이것도 맞는 말이다.
LinkedList는 List도 구현하고, Queue도 구현했다.
따라서 List로 자동 형변환할 수도 있고, Queue로 자동 형변환할 수도 있다.
LinkedList를 List로 형변환하게 되면,
List가 가지고 있는 멤버 + LinkedList에서 오버라이딩한 메소드를 사용할 수 있게 되므로
Queue의 멤버는 사용할 수 없게 된다.
따라서 LinkedList에서 의도한 기능만 남게 된다. 반대도 마찬가지이다.
Queue의 주요 메소드는 아래와 같다
offer(E item) : 주어진 객체를 큐에 넣는다.
poll( ) : 가장 처음에 넣은 객체(=가장 앞에 있는 객체)를 제거하고, 해당 객체를 리턴한다.
peek( ) : 가장 처음에 넣은 객체(=가장 앞에 있는 객체)를 리턴만 한다.
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
// 큐 생성 - LinkedList 이용
Queue<Message> messageQueue = new LinkedList<>();
messageQueue.offer(new Message("sendMail", "신용권"));
messageQueue.offer(new Message("sendKakaotalk", "홍길동"));
messageQueue.offer(new Message("sendSMS", "홍두께"));
while(!messageQueue.isEmpty()) {
Message message = messageQueue.poll();
switch(message.command) {
case "sendMail" : System.out.println(message.to+"에게 메일 보내"); break;
case "sendKakaotalk" : System.out.println(message.to+"에게 카톡 보내"); break;
case "sendSMS" : System.out.println(message.to+"에게 문자 보내"); break;
}
} // 신용권 - 홍길동 - 홍두께 순으로 보내진다.
}
}
class Message{
public String command;
public String to;
Message(String command, String to){
this.command = command;
this.to = to;
}
}
컬렉션 프레임워크 메소드 총 정리
List | Set | Map | Stack | Queue | |
삽입 | add(value) add(idx, value) |
add(value) | put(key, value) | push(value) | offer(value) |
삭제 | remove(idx) remove(value) |
remove(value) | remove(key) | pop( ) | poll( ) |
크기 | size( ) |
'JAVA > 혼공자' 카테고리의 다른 글
[혼공자] Chapter 14-2 보조 스트림 (1) | 2022.08.22 |
---|---|
[혼공자] Chapter 14-1 입출력 스트림 (2) | 2022.08.21 |
[혼공자] Chapter 13-1 컬렉션 프레임워크 (1) | 2022.08.19 |
[혼공자] Chapter 12-2 스레드 제어 (1) | 2022.08.17 |
[혼공자] Chapter 12-1 멀티 스레드 (1) | 2022.08.15 |