백준 구현문제를 푸는 중 10951: A+B-4문제와 15552: 빠른 A+B에서 더이상 Scanner와 System.out.println함수를 써서는 못푸는 문제가 나왔다.
그래서 이번 기회에 사용하면 유용할 BufferedReader와 BufferedWriter에 대해 알아보자한다.
이름처럼 버퍼를 이용하여 읽고 쓰는 함수이다.
버퍼를 사용하기 때문에 Scanner와 System.out.println()과 비교했을 때 효율이 굉장히 좋아진다.
아래 그림과 같은 방식으로 버퍼가 사용된다.

여기서 버퍼를 거쳐가는데 왜 더 빠르냐고 생각이 들 수 있다.
이에 대한 대답은, 하드디스크나 키보드, 마우스같은 외부장치는 CPU에 비해 속도가 굉장히 느리다. 때문에 중간에 메모리 버퍼를 둬서 데이터를 묶어서 전송하는 것이 효율적이고 빠르다.
예시를 들자면, 흙을 파서 언덕에 버리는데, 한 번 삽질할 때마다 가서 버리는 것보다 수레에 가득 채워서 한번에 나르는 것이 더 효율적인 것과 같은 이치이다.
즉, 입출력해야하는 데이터의 양이 많을 경우 Buffer를 사용하는 것이 훨씬 유리하다.
그럼 이 좋은 BufferedReader/Writer를 어떻게 사용하는가?
import java.io.*;
// 입력(n): 둘 째줄에서 입력 될 정수 개수, 무작위의 정수 n개
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
int[] arr = new int[n];
// StringTokenizer st = new StringTokenizer(reader.readLine());
// for (int i = 0; i < n; i++)
// arr[i] = Integer.parseInt(st.nextToken());
String[] str = reader.readLine().split(" ");
for(int i=0; i<n; i++)
arr[i] = Integer.parseInt(str[i]);
reader.close();
}
}
StringTokenizer 객체나 split()함수를 사용하면 된다.BufferedReader를 사용하기 위해 항상 IOException 예외처리를 해줘야한다!import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
writer.write("Hello World"); // 출력버퍼에 쓴다.
writer.flush(); // 출력버퍼를 비우면서 출력한다.
writer.close(); // 출력버퍼를 종료한다.
}
}
write() 메소드를 이용해 버퍼에 데이터를 입력하고flush() 메소드를 이용해 버퍼에 담긴 내용을 비우면서 출력!close() 메소드를 이용해 버퍼를 종료한다.IOException 예외처리해준다!하나의 문자열로 계속 연결시킨 뒤 한 번의 출력으로 모든 문자열을 출력시키는 방법이다.
위에 언급한 StringBuffer는 여러 곳에서 동시에 같은 문자열 인스턴스에 접근할 때 중복 점유를 막을 수 있는 장치가 되어 있다.(동기화 처리) 때문에, StringBuilder에 비해 좀 더 무겁다.
따라서 특별한 이유가 없다면 StringBuilder를 사용하는 것이 일반적이다.
기본적으로 초기화하는 것과 append(), System.out.print()로 출력하는 것만 알면 된다!
sb.append()에서 Sysout하듯이 매개변수를 넣어준다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
String input = br.readLine();
int sep = input.indexOf(" ");
int a = Integer.parseInt(input.substring(0, sep));
int b = Integer.parseInt(input.substring(sep + 1));
sb.append((a + b) + "\n");
}
System.out.print(sb);
br.close();
}
}