
백준 문제를 풀면서 BufferedReader와 BufferedWriter에 대해 처음 접하게 되었다.
원래 입력을 받을 때 주로 Scanner를 사용했었다.
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
- Scanner로 입력받기
그런데 알고리즘 측면에서 Scanner를 사용하면 시간초과가 나는 경우가 종종 있었다.
반면에 BufferedReader를 사용했을 때에 실행 속도가 현저히 빨랐다.
입출력 방식에 따라 시간 차이가 나는 점이 흥미로웠지만 정확히 왜인지는 사실 잘 몰랐던 터라, BufferedReader를 사용하는 이유에 대해 찾아보았다.
: 완충제, 완충 장치
Buffer는 어떠한 데이터가 전송될 때, 일시적으로 보관되는 메모리 영역이다.
버퍼는 컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용된다.
데이터가 입력될 때마다 출력하는 것이 아니라 어느정도 데이터가 모였을 때 한꺼번에 출력하도록 해준다.
따라서 Buffer가 존재하면, 입출력을 OS가 직접 처리함으로써 비효율적인 업무가 줄어드는 것이다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int userInputNumber = Integer.parseInt(br.readLine());
- BufferReader로 입력받기
BufferedReader로 정수 하나를 입력받을 때는 InputStreamReader라는 것이 존재한다.
자바에서 가장 기본이 되는 입/출력 스트림
'Stream'이란 출발지와 도착지를 이어주는 다리

System.in 은 InputStream 타입의 필드이다.
InputStream은 입력받은 데이터가 int형으로 저장되며 1byte만 읽는다.
Scanner 클래스는 문자를 입력받으면 정규식들을 검사하고 난 후에 문자열을 반환한다.
BufferedReader 클래스는 별다른 정규식을 검사하지 않으며 모든 입력을 Char형으로 버퍼를 사용하여 받는다. 전체 입력에 대해서만 전달되기 때문에 속도 부분에서 매우 유리하다.
이 때문에 속도는 빠르지만, 사용자가 사용하기 편하게 하려면 별도의 메서드를 호출해야 한다.
참고자료
https://silverji.tistory.com/36
https://velog.io/@roycewon/BufferedReader%EB%A5%BC-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90
https://onlyfor-me-blog.tistory.com/368