본문으로 바로가기

자바를 처음 접하게 되면 가장 먼저 공부하게 되는 것이 입출력이다.

보통은 System.out.println();과 Scanner클래스를 사용하여 입출력을한다.

하지만 입출력을 조금 더 빠르고 효율적으로 하려면 BufferedReader와 BufferedWriter를 사용해야한다.

 

BufferdReader/BufferdWriter

위의 클래스들은 이름에 Buffer가 들어가 있듯이 버퍼를 이용하여 입출력을 수행한다.

버퍼를 사용하지 않고 입력을 한다면 키보드를 누른 즉시 프로그램에 값들이 전달된다.

하지만 버퍼를 사용하게되면 키보드의 입력이 있을 때마다 한 문자씩 버퍼라는 공간에 전송하는데

버퍼가 가득차거나, 줄바꿈이 있을 시 버퍼의 내용을 한번에 전송하게된다.

 

여기서 오해할 수 있는 것은 버퍼를 사용하지 않는 것이 즉시 전달하기 때문에 더 빠를 것이라고 생각하는 것이다.

하지만 데이터 입출력은 생각보다 오래걸리는 작업이기 때문에 입력한 데이터를 즉시 전달하는 것보다 중간에 버퍼를 두어 모았다가 한번에 전송하는 것이 더 효율적이다.

쉽게 설명하자면 바닥에 쌀가마를 쏟았을 때 한톨한톨 줍는 것보다 쓰레받이에 모아서 버리는 것이 더 빠르다는 것과 같은 이치이다. 

 

BufferedReader

Scanner와 함께 자바에서 입력을 담당하는 클래스이다.

BufferedReader는 엔터(개행문자)를 경계로 인식하고 데이터를 오직 String으로만 읽는다.따라서 Scanner의 nextInt()와 같은 기능이 없어 int타입의 데이터가 필요하다면 따로 파싱해줘야하는 불편함이있다.하지만 Scanner보다 빠르다는 장점이있다. 

 

BufferedWriter

System.out.println()과 함께 자바에서 출력을 담당하는 클래스이다.

출력할 양이 적을 때는 System.out.println()을 사용해도 별 차이가 없지만 그 양이 많이진다면 버퍼를 이용하는 것이 효율적이다. 하지만 출력을 할 때 버퍼를 이용하는 것이기 때문에 버퍼에 남는 데이터가 없도록 항상 마지막에는 flush()메소드를 이용하여 남아있는 데이터를 다 출력하여 버퍼를 비워줘야한다. 

 

아래는 백준 15552번 문제에 두 클래스를 적용시킨 것이고 사용방법은 생각보다 간단했다.

 

문제

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

public class Main {

	public static void main(String[] args) throws IOException {
		String ab = "";
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int input = Integer.parseInt(br.readLine());


		int[] result = new int[input];

		for (int i = 0; i < input; i++) {
			ab = br.readLine();
			StringTokenizer st = new StringTokenizer(ab);
			result[i] = Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken());
		}
		for(int i=0;i<input;i++) {			
			bw.write(result[i]+"");
			bw.newLine();
		}
		
		bw.flush();
		br.close();
		bw.close();
		
	}

}

 

우선 BufferedReader객체와 BufferedWriter객체를 생성해주고 BufferedReader객체를 통해 입력을 받았다.

입력받은 것은 String타입 이었기에 int타입으로 형변환을 시켜주고 A+B의 결과값을 담을 배열의 크기로 지정해주었다.

그리고 입력받은 숫자만큼 반복문을 실행해 A와 B값을 한번에 입력받았는데 그 것을 StringTokenizer를 통해 분리해주고 분리된 값들을 int타입으로 변환하고 더하여 result배열의 각 인덱스에 담고 BufferedWriter를 통해 출력하였다.