자바 Queue 활용해보기

이전 포스트에서는 Stack을 이용한 예제를 살펴보았지만 이번에는 Queue를 활용해 보겠습니다.

package JavaChap11;

import java.util.*;

class Ex11_4 {
    static Queue q = new LinkedList();
    static final int MAX_SIZE = 5; 

    public static void main(String() args) {
        System.out.println("help를 입력하면 도움말을 볼 수 있습니다.

"); while(true) { System.out.print(">>"); try { // 화면으로부터 라인단위로 입력받는다.

Scanner s = new Scanner(System.in); String input = s.nextLine().trim(); //공백 제거 -> 앞뒤 공백 if("".equals(input)) continue; if(input.equalsIgnoreCase("q")) { System.exit(0); // 프로그램 종료 } else if(input.equalsIgnoreCase("help")) { System.out.println(" help - 도움말을 보여줍니다.

"); System.out.println(" q 또는 Q - 프로그램을 종료합니다.

"); System.out.println(" history - 최근에 입력한 명령어를 " + MAX_SIZE +"개 보여줍니다.

"); } else if(input.equalsIgnoreCase("history")) { //대소문자 구별 안함 int i=0; // 입력받은 명령어를 저장하고, save(input); // LinkedList의 내용을 보여준다.

LinkedList tmp = (LinkedList)q; ListIterator it = tmp.listIterator(); while(it.hasNext()) System.out.println(++i+"."+it.next()); } else { save(input); System.out.println(input); } // if(input.equalsIgnoreCase("q")) { } catch(Exception e) { System.out.println("입력오류입니다.

"); } } // while(true) } // main() public static void save(String input) { // queue에 저장한다.

if(!
"".equals(input)) //if(!
input.equals("")) q.offer(input); //큐에 저장 명령 // queue의 최대크기를 넘으면 제일 처음 입력된 것을 삭제한다.

if(q.size() > MAX_SIZE) // size()는 Collection인터페이스에 정의 q.remove(); //q.poll()도 동일하다.

} } // end of class

=================실행 결과=====================

1.D
두 번째 이야기
>>이야기
1.D
두 번째 이야기
3.역사
>>이야기
1.D
두 번째 이야기
3.역사
4.역사
>>이야기
1.D
두 번째 이야기
3.역사
4.역사
5.역사
>>이야기
첫 번째 이야기
두 번째 이야기
3.역사
4.역사
5.역사
>>q


static Queue q = new LinkedList();
static final int MAX_SIZE = 5; 

먼저 대기열을 구현하고 최대 5개만 저장하도록 설정을 구성합니다.

while(true) {
    System.out.print(">>");

무한 루프를 돌린 후,

Scanner s = new Scanner(System.in);
String input = s.nextLine().trim();

값을 입력하면 입력한 값에서 선행 및 후행 공백이 제거됩니다.

if("".equals(input)) continue;

빈 문자열이면 Continue가 실행되고 다시 While(true)으로 이동하고 >>가 표시됩니다.

if(input.equalsIgnoreCase("q")) {
    System.exit(0); // 프로그램 종료
} else if(input.equalsIgnoreCase("help")) {
    System.out.println(" help - 도움말을 보여줍니다.

"); System.out.println(" q 또는 Q - 프로그램을 종료합니다.

"); System.out.println(" history - 최근에 입력한 명령어를 " + MAX_SIZE +"개 보여줍니다.

"); } else if(input.equalsIgnoreCase("history")) { //대소문자 구별 안함 int i=0; // 입력받은 명령어를 저장하고, save(input); // LinkedList의 내용을 보여준다.

LinkedList tmp = (LinkedList)q; ListIterator it = tmp.listIterator(); while(it.hasNext()) System.out.println(++i+"."+it.next()); } else { save(input); System.out.println(input); } /

대소문자를 구분하지 않고 q를 입력하면 프로그램을 종료합니다.

도움말, q 또는 Q 및 히스토리와 같은 기능이 구현되었으며 여기서 자세히 살펴볼 곳은 히스토리입니다.

이력 입력 시 i=0으로 설정되며 입력된 이력도 저장됩니다.

그리고 LinkedList를 구현함으로써 지금까지 입력된 리스트 hasNext()는 계속해서 다음 요소를 호출한다.

최대 5개의 리스트가 로드되며 FIFO 구조에 먼저 들어오는 항목이 먼저 추출되어 사라집니다.

if(q.size() > MAX_SIZE)  // size()는 Collection인터페이스에 정의
    q.remove();

크기는 초기에 5로 설정되어 있으며 5 이상의 입력 단어가 수신되면 내용이 지워집니다.

FIFO 구조로 제거됩니다.