후입 선출(LIFO : Last In First Out)은 나중에 넣은 객체가 먼저 빠져나가는 자료구조를 말한다. 반대로 선입선출(FIFO : First In First Out)은 먼저 넣은 객체가 먼저 빠져나가는 자료구조를 말한다.
컬렉션 프레임워크에는 LIFO 자료구조를 제공하는 Stack 클래스와 FIFO 자료구조를 제공하는 Queue 인터페이스를 제공하고 있다.
Stack
Stack 클래스는 LIFO 자료구조를 구현한 클래스이다. 아래 표는 Stack 클래스의 주요 메소드이다.
| 리턴 타입 | 메소드 | 설명 |
| E | push(E item) | 주어진 객체를 스택에 넣는다. |
| E | peek() | 스택의 맨 위 객체를 가져온다. 객체를 스택에서 제거하지는 않는다. |
| E | pop() | 스택의 맨 위 객체를 가져온다. 객체르 스택에서 제거한다. |
Stack 객체를 생성하려면 저장할 객체 타입을 E 타입 파라미터 자리에 표기하고 기본 생성자를 호출하면 된다. 예를 들어 String을 저장하는 Stack은 아래와 같이 생성할 수 있다.
Stack<E> stack = new Stack<E>();
Stack<E> stack = new Stack<>();
아래는 동전 케이스를 Stack 클래스로 구현한 예제이다. 동전 케이스는 위에만 열려 있는 스택 구조를 갖고 있다. 먼저 넣은 동전은 제일 밑에 깔리고 나중에 넣은 동전이 위에 쌓이기 때문에 Stack에서 동전을 빼면 마지막에 넣은 동전이 먼저 나오게 된다.
// 동전 클래스
public class Coin{
private int value;
public Coin(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
// 메인 클래스
improt java.util.*
public class StackExample{
public static void main(String[] args){
Stack<Coin> coinBox = new Stack<Coin>();
coinBox.push(new Coin(100));
coinBox.push(new Coin(50));
coinBox.push(new Coin(500));
coinBox.push(new Coin(10));
while(!coinBox.isEmpty()){
Coin coin = coinBox.pop();
System.out.println("꺼내온 동전 : " + coin.getValue() + "원");
}
}
}
Queue
Queue 인터페이스는 FIFO 자료구조에서 사용되는 메소드를 정의하고 있다. 아래는 Queue 인터페이스에 정의되어 있는 메소드이다.
| 리턴 타입 | 메소드 | 설명 |
| boolean | offer(E e) | 주어진 객체를 넣는다. |
| E | peek() | 객체 하나를 가져온다. 객체를 큐에서 제거하지 않는다. |
| E | poll() | 객체 하나를 가져온다. 객체를 큐에서 제거한다. |
Queue 인터페이스를 구현한 대표젹인 클래스는 LinkedList 이다. LinkedList는 List 인터페이스를 구현했기 때문에 List 컬렉션이기도 하다. 아래 코드는 LinkedList 객체를 Queue 인터페이스 타입으로 변환한 것이다.
Queue<E> queue = new LinkedList<E>();
Queue<E> queue = new LinkedList<>();
아래는 Queue를 이용해서 간단한 메시지 큐를 구현한 예제이다. 먼저 넣은 메시지가 반대쪽으로 먼저 나오기 때문에 넣은 순서대로 메시지가 처리된다.
// Message 클래스
public class Message{
public String command;
public String to;
public Message(String command, String to){
this.command = command;
this.to = to;
}
}
// 메인 클래스
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample{
public static void main(String[] args){
Queue<Message> messageQueue = new LinkedList<Message>();
messageQueue.offer(new Message("sendMail", "홍길동");
messageQueue.offer(new Message("sendSMS", "이순신");
messageQueue.offer(new Message("sendCacaoTalk", "세종대왕");
while(!messageQueue.isEmpty()){
Message message = messageQueue.poll();
switch(message.command){
case "sendMail"
System.out.println(message.to + "님에게 메일을 보냅니다.");
berak;
case "sendSMS"
System.out.println(message.to + "님에게 SMS을 보냅니다.");
berak;
case "sendCacaoTalk"
System.out.println(message.to + "님에게 카카오톡을 보냅니다.");
berak;
}
}
}
}'Java' 카테고리의 다른 글
| 자바 보조 스트림 (0) | 2023.06.30 |
|---|---|
| 자바 입출력 스트림 (0) | 2023.06.29 |
| 자바 컬렉션 프레임워크 (0) | 2023.06.29 |
| 자바 스레드 제어 (0) | 2023.06.29 |
| 자바 멀티 스레드 (0) | 2023.06.28 |