-
[Java] 컬렉션 프레임워크 - LIFO와 FIFO 컬렉션CSE/Java 2015. 9. 19. 16:21
컬렉션 프레임 워크는 여러 절로 구성되어 있습니다.
후입선출(LIFO: Last In First Out)은 나중에 넣은 객체가 먼저 빠져나가는 자료구조를 말합니다.
반대로 선입선출(FIFO: First In First Out)은 먼저 넣은 객체가 먼저 빠져나가는 구조를 말합니다.
컬렉션 프레임워크에는 LIFO 자료구조를 제공하는 스택(Stack) 클래스와 FIFO 자료구조를 제공하는 큐(Queue) 인터페이스를 제공하고 있습니다.
스택(Stack)을 응용한 대표적인 예가 JVM 스택 메모리입니다. 스택 메모리에 저장된 변수는 나중에 저장된 것부터 제거됩니다.
큐(Queue)를 응용한 대표적인 예가 스레드풀(ExecutorService)의 작업 큐입니다. 작업 큐는 먼저 들어온 작업부터 처리합니다.
1 Stack
Stack 클래스는 LIFO 자료구조를 구현한 클래스입니다. 다음은 Stack 클래스의 주요 메소드들입니다.
Stack 객체를 생성하기 위해서는 저장할 객체 타입을 파라미터로 표기하고 기본 생성자를 호출하면 됩니다.
* Coin.java
123456789101112131415161718192021package set;public class Coin {private int value;public Coin(int value) {super();this.value = value;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}}cs * StackExam.java
12345678910111213141516171819202122232425package set;import java.util.Stack;public class StackExam {public static void main(String[] args) {Stack<Coin> stack = new Stack<Coin>();stack.push(new Coin(100));stack.push(new Coin(50));stack.push(new Coin(500));stack.push(new Coin(100));stack.push(new Coin(50));stack.push(new Coin(50));stack.push(new Coin(500));while (!stack.isEmpty()) {Coin coin = stack.pop();System.out.println("꺼낸 동전: " + coin.getValue() + " 원");}}}cs 2 Queue
Queue 인터페이스는 FIFO 자료구조에서 사용되는 메소드를 정의하고 있습니다. 다음은 Queue 인터페이스에 정의되어 있는 메소드들입니다.
Queue 인터페이스를 구현한 대표적인 클래스는 LinkedList입니다.
LinkedList 는 List 인터페이스를 구현했기 때문에 List 컬렉션이기도 합니다.
다음 코드는 LinkedList 객체를 Queue 인터페이스 타입으로 변환한 것입니다.
다음은 Queue를 이용해서 간단한 메시지 큐를 구현한 예제입니다. 먼저 넣은 메시지가 반대쪽으로 먼저 나오기 때문에 넣은 순서대로 메시지가 처리됩니다.
* Message.java
123456789101112131415package set;public class Message {public String command;public String to;public Message(String command, String to) {super();this.command = command;this.to = to;}}cs * QueueExam.java
1234567891011121314151617181920212223242526272829303132333435363738394041package set;import java.util.LinkedList;import java.util.Queue;public class QueueExam {public static void main(String[] args) {Queue<Message> queue = new LinkedList<Message>();queue.offer(new Message("sendMail", "Jack"));queue.offer(new Message("sendSMS", "Maggie"));queue.offer(new Message("sendKakaotalk", "Blue"));queue.offer(new Message("sendLine", "Jack"));while (!queue.isEmpty()) {Message msg = queue.poll();switch (msg.command) {case "sendMail":System.out.println(msg.to + " 님께 메일을 보냅니다");break;case "sendSMS":System.out.println(msg.to + " 님께 문자를 보냅니다");break;case "sendKakaotalk":System.out.println(msg.to + " 님께 카톡을 보냅니다");break;case "sendLine":System.out.println(msg.to + " 님께 라인을 보냅니다");break;}}}}cs * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.
'CSE > Java' 카테고리의 다른 글
[Java] 제네릭(Generic) - 제네릭 타입 (1) 2015.09.20 [Java] 제네릭(Generic) - Intro (0) 2015.09.20 [Java] 컬렉션 프레임워크 - 동기화, 병렬 처리 (0) 2015.09.20 [Java] 컬렉션 프레임워크 - 검색 기능을 강화시킨 컬렉션 (0) 2015.09.14 [Java] 컬렉션 프레임워크 - Map 컬렉션 (0) 2015.09.13 [Java] 컬렉션 프레임워크 - Set 컬렉션 (0) 2015.09.13