자바 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 구조로 제거됩니다.