[Java1000제] 콘솔 만들기 2 - 도스창 따라하기

21672 단어 JavaJava1000제Java

문제

[문제2] 사용자가 입력한 명령라인을 공백(' ')을 구분자로 해서 잘라서 배열에 저장한 다음에 배열의 내용을 출력하는 예제. 코드를 완성하세요.

[예제ConsoleEx2.java]

import java.util.*;

class ConsoleEx2 {
      static String[] argArr;       // 입력한 매개변수를 담기위한 문자열배열

      public static void main(String[] args) {
            while(true) {
                  String prompt = ">>";
                  System.out.print(prompt);
                 
                  // 화면으로부터 라인단위로 입력받는다.
                  Scanner s = new Scanner(System.in);
                  String input = s.nextLine();


 

                 /*

                     다음의 코드를 완성하세요.

                     1. 입력받은 값에서 앞뒤 공백을 제거한다. (String클래스의 trim()사용)
                     2. 입력받은 명령라인의 내용을 공백을 구분자로 해서 나눠서 argArr에 담는다.

                         String클래스의 split(String regex)를 사용 - 공백이 하나 이상인 경우에도 하나의 공백으로 간주해야함

                         실행결과를 주의깊게 확인하세요.

                 */

                  if(input.equalsIgnoreCase("Q")) { // q 또는 Q를 입력하면 실행종료한다.
                        System.exit(0);
                  } else {
                        for(int i=0; i < argArr.length;i++) {
                              System.out.println(argArr[i]);
                        }
                        /* 위의 코드를 향상된 for문으로 변경하면 다음과 같다.
                        for(String arg : argArr) {
                              System.out.println(arg);                                                      
                        }
                        */
                  }
            } // while(true)
      } // main
} // class

[실행결과]

>>java ConsoleEx2.java aaa bbb ccc
java
ConsoleEx2.java
aaa
bbb
ccc
>>q

https://cafe.naver.com/javachobostudy/24688

나의 풀이

공백 하나가 아닌 여러 공백이 있더라도 해당 공백을 기준으로 문자열을 잘라야한다. 공백의 개수가 제한되어 있지 않으므로 일반 멤버변수가 아닌 정규식을 이용하였다.

import java.util.*;

class ConsoleEx2 {
    static String[] argArr;
    static final String ALL_SPACE = "\\s+";

    public static void main(String[] args) {
        while(true) {
            String prompt = ">> ";
            System.out.print(prompt);

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

            argArr = input.split(ALL_SPACE);

            if(input.equalsIgnoreCase("Q")) {
                System.exit(0);
            } else {
                for(int i=0; i < argArr.length;i++) {
                    System.out.println(argArr[i]);
                }
            }
        }
    }
}

저자 풀이

답을 알기 위해 3번 문제를 가져왔다. 사실 도저히 모르겠어서 카페 댓글에 있는 분 소스코드를 참고했었는데 훨씬 더 간단하게 해결하셨다. 하지만 실제 공백 문자는 스페이스로 만들어진 공백만 처리하고 탭같은 다른 공백은 처리하지 못한다. 상황에 따라서 맞춰쓰면 될거같다.

import java.util.*;

class ConsoleEx3 {
      static String[] argArr;                         // 입력한 매개변수를 담기위한 문자열배열
      static LinkedList q = new LinkedList(); // 사용자가 입력한 내용을 저장할 큐(Queue)
      static final int MAX_SIZE = 5;              // q(큐)에 저장될 수 있는 값의 개수

 

      public static void main(String[] args) { 
            Scanner s = new Scanner(System.in); // 한번만 생성해서 재사용하면 되므로 반복문 밖으로 이동

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

                  save(input);

                  input = input.trim();        // 입력받은 값에서 불필요한 앞뒤 공백을 제거한다.
                  argArr = input.split(" +"); 


                  String command = argArr[0].trim();

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

                  command = command.toLowerCase(); // 명령어를 소문자로 바꾼다.

                  if(command.equals("q")) { // q 또는 Q를 입력하면 실행종료한다.
                        System.exit(0);
                  } else if(command.equals("history")) {  // equalsIgnoreCase대신 equals를 사용.
                        history();
                  } else {
                        for(int i=0; i < argArr.length;i++) {
                              System.out.println(argArr[i]);
                        }
                  }
            } // while(true)
      } // main



      public static void save(String input) {
            if(input==null || "".equals(input)) return;


            /*

                다음의 코드를 완성하세요.

                1. queue에 저장한다.
                2. queue의 최대크기(MAX_SIZE)를 넣으면 제일 오래된 저장값을 삭제한다. 

           */
      }

      // 사용자가 입력한 최근 명령을 보여주는 메서드
      public static void history() {
            int i=0;

            /*

                다음의 코드를 완성하세요.
                1. LinkedList에 저장된 내용(최근 MAX_SIZE개의 명령어)을 보여준다. 

           */
      }
} // class

좋은 웹페이지 즐겨찾기