[Java] 입출력

 

1. 입력

입력 속도 비교

가. Scanner

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String[] foods = new String[num];
        for(int i=0; i<num; i++){
            foods[i] = sc.next();
        }
        for(String food : foods){
            System.out.println(food);
        }
        sc.close();
    }
}
Code language: JavaScript (javascript)

가장 쉽고 간편한 방법.

하지만 느리다.


나. BufferedReader

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Test2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int num = Integer.parseInt(st.nextToken());
        String[] foods = new String[num];

        for(int i=0; i<num; i++){
            st = new StringTokenizer(br.readLine());
            foods[i] = st.nextToken();
        }

        for(String food : foods){
            System.out.println(food);
        }
        br.close();
    }
}
Code language: JavaScript (javascript)
  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    : 데이터를 버퍼에 저장해 두었다가 전달.
    : 입력받는 데이터의 수가 커질 수 록 속도면에서 빠르고 효율적.
  • new InputStreamReader(System.in)
    : 입력을 바이트 단위로 읽어서 문자 단위로 반환하는 클래스
  • import java.io.IOException;, throws IOException
    : BufferedReader에서 던지는 에러가 있기 때문에 필요함.
  • st = new StringTokenizer(br.readLine());
    : 줄이 바뀔 때마다 새로운 StringTokenizer 생성해야함.
  • st.nextToken();
    : 다음 문자열 토큰 반환.
  • int num = Integer.parseInt(st.nextToken());
    : 정수를 입력받는 방법.

1) StringTokenizer

StringTokenizer (Java Platform SE 8 )

  • 생성자

  • 메서드


2. 출력

출력 속도 비교

가. System.out.println()

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Test2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int num = Integer.parseInt(st.nextToken());
        String[] foods = new String[num];

        for(int i=0; i<num; i++){
            st = new StringTokenizer(br.readLine());
            foods[i] = st.nextToken();
        }

        for(String food : foods){
            System.out.println(food);
        }
        br.close();
    }
}
Code language: JavaScript (javascript)

출력할 데이터가 많으면 System.out.println가 시간을 많이 사용한다.


나. BufferedWriter

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

public class Test2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));        

        int num = Integer.parseInt(st.nextToken());
        String[] foods = new String[num];

        for(int i=0; i<num; i++){
            st = new StringTokenizer(br.readLine());
            foods[i] = st.nextToken();
        }

        for(String food : foods){
            bw.write(food);
            bw.newLine();
        }
        br.close();
        br.flush();
        br.close();
    }
}
Code language: JavaScript (javascript)
  • BufferedWriter : 버퍼를 사용하여 쓰기.
  • OutputStreamWriter : 문자 스트림을 바이트 스트림으로 변환한다.
  • bw.write(food + "\n"); : 출력.
  • bw.newLine(); : 개행.
  • bw.flush(); : 버퍼 사용 시 flush() 습관화.

다. StringBuilder

import java.lang.StringBuilder;

...

StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < n; i++) {
    sb.append(data[i] + " ");
}

System.out.println(sb.toString());
Code language: JavaScript (javascript)

BufferedWriter랑 크게 차이가 없음.

Java의 String은 immutable한 객체이기 때문에 수정하면 성능이 저하된다.

이에 문자열을 빈번하게 수정하는 경우 StringBuilder를 활용한다.

(Single thread에선 StringBuilder, multi thread에선 StringBuffer 사용하자)


댓글 남기기