알고리즘을 공부하면서 입력값을 받을 때 Scanner, BufferedReader를 사용하게 된다. 이번에 알고리즘 문제를 풀면서 메모리 초과가 났을 때 입력 방식을 Scanner에서 BufferedReader로 교체 하니 메모리 문제가 해결이 되었다.
이를 계기로 Scanner와 BufferedReader에 대해 정리를 해보려고 한다.
Scanner
Scanner 클래스는 입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스이다. 간단하게 기본형과 String 타입을 정규표현식을 사용해 파싱(parse)할 수 있다.
- java.util 패키지에 속한다. (java.util.Scanner)
- 공백(띄어쓰기) 및 개행(줄 바꿈)을 기준으로 읽는다.(' ', '\t', '\r', '\n' 등) 원하는 타입으로 읽을 수 있다.
- 버퍼의 사이즈가 1024byte(1KB) 이다.
- 데이터를 입력받을 경우 즉시 사용자에게 전송되며 입력받을 때마다 전송되어야 하기에 많은 시간이 소요된다.
BufferedReader
데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스이다. 즉 사용자가 입력한 문자 스트림을 읽는 것(read) 라고 한다.
- java.io 패키지에 속한다. (import java.io.BufferedReader)
- 데이터를 파싱하지 않고 String으로만 읽고 가져온다.
- 버퍼의 사이즈가 8192byte(8KB)이다.
- 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 프로그램으로 전달하기에 Scanner보다 소요되는 시간을 절약할 수 있다.
Scanner와 BufferedReader의 차이점
- Scanner는 BufferedReader보다 타입에 구애받지 않는다.
- BufferedReader는 Scanner보다 효율적인 메모리 용량을 가진다.
- BufferedReader는 Scanner보다 안전하다.
- BufferedReader가 Scanner보다 실행 속도가 빠르다.
BufferedReader가 더 빠른 이유
- 문자가 입력될 때마다 CPU가 하나하나 입출력을 하는 것보다 버퍼에 어느정도 쌓아두고 가득차거나 개행이 일어날 때마다 입출력을 처리하는 것이 훨씬 효율적이다.
- Scanner는 입력을 읽는 과정에서 정규식 적용, 파싱 과정을 거친다. BufferedReader는 String으로만(데이터를 파싱 하지 않고) 읽어드린다.
참고 문서 및 링크