자바 입/출력 처리 최적화

자바 입/출력 처리 최적화

  • 표준 입출력

  • java.util.Scanner

    • Scanner(File source)

    • Scanner(InputStream source)

    • Scanner(String source)

    • 파일, 입력 스트림과 같은 다양한 입력 소스에서 데이터를 읽어 구분자로 토큰화하고 다양한 타입으로 변환하여 값을 리턴해주는 역할의 클래스

      Scanner sc = new Scanner(System.in);
      String line = sc.nextLine(); //개행(Enter) 문자를 만나면 개행 문자까지 포함해서 읽어서 처리
      String next = sc.next(); // White space 문자를 만나면 White space를 포함하지 않고 처리
                             // 앞에 읽은 White space는 빼버림
      int n = sc.nextInt(); // White space 문자를 만나면 White space를 포함하지 않고 처리
                          // 앞에 읽은 White space는 빼버림
      
    • next()와 nextLine()를 같이 쓸 때 개행 문자 포함 여부를 주의해야 한다

      //n
      //k1 1 2 3 ... k1
      //k2 1 2 3 ... k2
      //...
      //kn 1 2 3 ... kn
      Scanner sc = new Scanner(System.in);
      int n = sc.nextInt();
      
      for (int i = 0; i < n; ++i) {
        int k = sc.nextInt();
      
        for (int j = 0; j < k; ++j) {
            int data = sc.nextInt();
            System.out.println(data);
        }
      }
      
    • 장점

      • 손쉽게 입력처리 가능

      • 데이터 형변환으로 인한 편리함

    • 단점

      • 하나씩 읽기 때문에 대량의 데이터 처리 시 수행시간이 비효율적임
  • java.io.BufferedReader

    • 필터 스트림 유형

    • readLine(): 줄단위 문자열 처리 기능 제공

    • 줄단위로 읽기 때문에 대량의 데이터 처리 시 수행시간이 효율적임

      //n
      //k1 1 2 3 ... k1
      //k2 1 2 3 ... k2
      //...
      //kn 1 2 3 ... kn
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      int n = Integer.parseInt(br.readLine());
      
      for (int i = 0; i < n; ++i) {
        String str = br.readLine();
        String[] dataArr = str.split(" ");
      
        int k = Integer.parseInt(dataArr[0]);
      
        for (int j = 1; j <= k; ++j) {
            int data = Integer.parseInt(dataArr[j]);
            System.out.println(data);
        }
      }
      
  • java.util.StringTokenizer vs String.split()

    • split()은 정규식을 사용하는데, StringTokenizer는 주어진 하나의 구분자만 사용하기 때문에 속도 측면에서 성능이 더 좋다

    • 구분자를 생략하면 공백이 기본 구분자가 된다

    • split()은 구분자를 다양하게 줄 수 있어 가변요소가 많을 때는 split()이 유용하다

      //n
      //k1 1 2 3 ... k1
      //k2 1 2 3 ... k2
      //...
      //kn 1 2 3 ... kn
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      int n = Integer.parseInt(br.readLine());
      
      for (int i = 0; i < n; ++i) {
        StringTokenizer st = new StringTokenizer(br.readLine());
        int k = Integer.parseInt(st.nextToken());
      
        for (int j = 0; j < k; ++j) {
            int data = Integer.parseInt(st.nextToken());
            System.out.println(data);
        }
      }
      
  • java.lang.StringBuilder

    • 문자열의 조작을 지원하는 클래스

    • append()로 모아서 한 번에 toString()하기 때문에 자바에서 상수로 취급되는 무자열을 조작 시마다 새로운 문자열이 생성되는 것을 방지해서 메모리 효율과 속도가 향상됨