BufferedReader와 BufferedWriter, Scanner와 System.out.println()의 차이점

geonu·2022년 1월 18일
0
post-thumbnail
post-custom-banner

baekjoon 11021
https://www.acmicpc.net/problem/11021

BufferedReader와 BufferedWriter

말 그대로 버퍼를 이용해 입출력을 하는 함수이다.

Scanner 와 BufferedReader
System.out.println() 와 BufferedWriter

위의 함수들은 비슷한 기능을 하지만 속도와 효율성 면에서 차이를 보인다.
전자의 함수들은 한 문자 한 문자 키보드의 입력에 따라 프로그램에 전달하지만 후자의 함수들은 메모리 버퍼에 문자들을 보관하고 있다가 버퍼가 가득 차거나 버퍼 플러시(flush)가 되는 순간 프로그램에 전달한다.

즉, 이벤트 발생 시 건별로 데이터를 이동시키는 것보다 버퍼를 이용해 데이터의 이동을 최소화한 방식이 속도와 효율 면에서 유리하다.

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
        
for(int i=0; i<n; i++) {
	int a = sc.nextInt();
	int b = sc.nextInt();
	System.out.printf("Case #%d: %d\n", (i+1), (a+b));
}

// 276ms
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int a,b;

int T = Integer.parseInt(br.readLine());
        
for(int i=1; i<=T; i++){
    st = new StringTokenizer(br.readLine());
    a = Integer.parseInt(st.nextToken());
    b = Integer.parseInt(st.nextToken());
    bw.write("Case #"+i+": "+(a+b)+"\n");
}

bw.flush();
br.close();

// 168ms

하지만 주의할 점이 있다.
BufferdReader를 통해 입력을 받은 데이터형은 String으로 고정된다. 따라서 추가적인 형 변환이 필요하다.

BufferedWriter.write(int i)일 때 출력이 되지 않는 경우

BufferdReader을 통해 입력받은 데이터를 int형으로 변환하고 BufferedWriter으로 출력을 하고자 할 때 출력이 되지 않는 문제가 있다.

BufferedWriter.write(int i)일 때 int i는 (char) i로 형 변환한다.
즉, 아스키코드로 10진이 문자로 변환된다.
아스키코드의 1~32까지는 제어문자 및 공백문자이며 그 이후는 특수문자를 거치게 된다.
따라서 BufferedWriter.write에 int형인 1~32는 공백으로 출력되며 33부터는 특수문자가 출력된다.

마무리

버퍼를 이용한 BufferedReader와 BufferedWriter를 이용한 입출력이 Scanner와 System.out.println()를 이용한 입출력보다 속도와 효율성 면에서 좋다.

profile
시작이 있어야
post-custom-banner

0개의 댓글