1. Scanner
Scanner는 띄어스기와 개행문자를 경계로 값을 입력하기 때문에 따로 가공할 필요가 없다.
지원하는 메소드가 많기 때문에 원하는 데이터로 바로 가공할 수 있다.
버퍼 사이즈가 1024B = 1KB 이므로 많은 입력을 사용하는 경우 성능 상 좋지 못한 결과를 야기한다. (이로 인해 알고리즘 문제를 풀 때 시간초과가 발생할 수 있다.)
2. BufferedReader
BufferedReader는 개행문자만 경계로 인식하고 입력받은 데이터를 String 으로 고정한다.
따라서 추가적인 가공 작업이 필요하다.
버퍼 사이즈가 8192B = 8KB 이므로 입력 데이터가 많은 경우 성능 상 이점을 챙길 수 있다.
3. BufferedReader 를 사용할 때와 Scanner의 속도가 차이가 나는 이유

버퍼를 사용하지 않는 입력은 키보드를 누르는 즉시 바로 전달되어 속도가 느리다. 버퍼를 사용한 입력은 버퍼에 보관해 두고 가득 차거나, 개행 문자가 나타났을 때 버퍼의 내용을 한 번에 전송하여 속도가 빠르다. BufferedReader 의 버퍼 사이즈는 8KB 이고 Scanner 의 버퍼 사이즈는 1KB 이므로 버퍼의 사이즈 때문에 둘의 속도차가 발생한다.
4. 또 다른 차이는?
- BufferedReader 의 경우 동기화를 사용하여 멀티쓰레드 환경에서 안전하게 수행된다. Scanner는 동기화를 사용하지 않아 멑티 쓰레드 환경에서 안전하게 수행되지 못한다. 동기화를 사용하기 때문에 BufferedReader 가 더 느리지 않냐고 반문할 수 있으나 버퍼 사이즈 크기의 영향을 넘지 못한다.
- BufferedReader 는 CheckedException 을 발생시키기 때문에 예외 처리가 필수이다. Scanner 는 UnCheckedException이므로 예외 처리를 생략할 수 있다.
5. 사용법
Scanner
Scanner scanner = new Scanner(System.in);
scanner.next(); // 버퍼에 입력된 문자에서 문자나 문자열에서 공백 전까지의 단어를 읽는다. 개행문자를 가져오지 않는다.
scanner.nextLine(); // 문자 또는 엔터를 치기 전까지의 문장 전체를 입력받는다. 개행 문자도 읽어온다.
scanner.nextInt();
scanner.nextDouble();
BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine(); // 문장 전체로 읽어온다.
StringTokenizer st = new StringTokenizer(input);
int val1 = Integer.parseInt(st.nextToken());
int val2 = Integer.parseInt(st.nextToken());
6. 참고 자료
https://friends-aihaja.tistory.com/entry/1-BufferReader-VS-Scanner-%EC%B0%A8%EC%9D%B4%EC%A0%90
https://juno-juno.tistory.com/99
'자바' 카테고리의 다른 글
| 자바 자료구조 (4) | 2025.08.06 |
|---|---|
| String 클래스 (0) | 2024.09.09 |