- 후입선출(LIFO : Last In First Out) : 나중에 넣은 객체가 먼저 빠져나가는 자료구조
- 선입선출(FIFO : First In First Out) : 먼저 넣은 객체가 먼저 빠져나가는 자료구조
- 컬렉션 프레임워크에는 LIFO(리포) 자료구조를 제공하는 Stack 클래스와 FIFO(피포) 자료구조를 제공하는 Queue 인터페이스를 제공한다.
Stack
① Stack 클래스는 LIFO 자료구조를 구현한 클래스. 다음은 주요 메소드 이다.
리턴타입 | 메소드 | 설명 |
E | push(E item) | 주어진 객체를 스택에 넣습니다. |
E | peek() | 스택의 맨 위 객체를 가져옵니다. 객체를 스택에서 제거하지 않습니다. |
E | pop() | 스택의 맨 위 객체를 가져옵니다. 객체를 스택에서 제거합니다. |
② Stack 객체를 생성하려면 저장할 객체 타입을 E타입 파라미터 자리에 표기하고 기본 생서자를 호출하면 된다.
예를 들어 String을 저장하는 Stack은 다음과 같이 생성할 수 있다.
③ 사용 예는 다음과 같다.
public class Coin {
private int value;
public Coin(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
public class StackExample {
public static void main(String[] args) {
Stack<Coin> coinBox = new Stack<>();
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());
}
}
}
<실행결과>
꺼내온 동전 = 10
꺼내온 동전 = 500
꺼내온 동전 = 50
꺼내온 동전 = 100
Queue
① Queue 인터페이스는 FIFO 자료구조에서 사용되는 메소드를 정의한다. 다음은 Queue 인터페이스에 정의되어 있는 메소드이다.
리턴 타입 | 메소드 | 설명 |
boolean | offer(E e) | 주어진 객체를 넣는다. |
E | peek() | 객체 하나를 가져온다. 객체를 큐에서 제거하지 않는다. |
E | pool() | 개체 하나를 가져온다. 객체를 큐에서 제거한다. |
② Queue 인터페이스를 구현한 대표적인 클래스는 LinkedList 이다. LinkedList는 List 인터페이스를 구현했기 때문에 List 컬렉션이기도 하다. 아래는 LinkedList 객체를 Queue 인터페이스로 변환한 것
③ 사용 예 - 먼저 넣은 메시지가 반대쪽으로 먼저 나오기 때문에 넣은 순서대로 메시지가 처리된다.
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<>();
messageQueue.offer(new Message("sendMail","홍길동"));
messageQueue.offer(new Message("sendSMS","신용권"));
messageQueue.offer(new Message("sendKakaotalk","홍두께"));
while (!messageQueue.isEmpty()) {
Message message = messageQueue.poll();
switch (message.command) {
case "sendMail" :
System.out.println(message.to + "님에게 메일을 보냅니다.");
break;
case "sendSMS" :
System.out.println(message.to + "님에게 SMS을 보냅니다.");
break;
case "sendKakaotalk" :
System.out.println(message.to + "님에게 카카오톡을 보냅니다.");
break;
}
}
}
}
<실행결과>
홍길동님에게 메일을 보냅니다.
신용권에게 SMS을 보냅니다.
홍두께님에게 카카오톡을 보냅니다.
참고자료 : <혼자 공부하는 자바> - 신용권
'Coding > Java' 카테고리의 다른 글
[33] JAVA 보조 스트림 (2) | 2023.01.24 |
---|---|
[32] JAVA 입출력 스트림 (0) | 2022.12.28 |
[30] JAVA 컬렉션 프레임워크 (0) | 2022.12.25 |
[29] JAVA 스레드 제어 (0) | 2022.12.21 |
[28] JAVA 멀티스레드 (0) | 2022.12.21 |