• 후입선출(LIFO : Last In First Out) : 나중에 넣은 객체가 먼저 빠져나가는 자료구조
  • 선입선출(FIFO : First In First Out) : 먼저 넣은 객체가 먼저 빠져나가는 자료구조
  • 컬렉션 프레임워크에는 LIFO(리포) 자료구조를 제공하는 Stack 클래스와 FIFO(피포) 자료구조를 제공하는 Queue 인터페이스를 제공한다.

https://carminati.altervista.org/PROJECTS/C++/FIFO%20and%20LIFO/FIFOandLIFO.html

 

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)  주어진 객체를 넣는다. 
peek()  객체 하나를 가져온다. 객체를 큐에서 제거하지 않는다. 
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

+ Recent posts