자바에서 Scanner와 BufferedReader는 모두 외부 시스템으로부터 입력을 읽어오는 데 사용되는 대표적인 클래스입니다. 두 클래스는 비슷한 용도로 쓰이지만 내부 동작 방식과 성능 특성에서 뚜렷한 차이를 보입니다.
일반적으로 Scanner는 입력값이 문자열이나 기본 타입(primitive type)이라는 것을 미리 알고 있을 때 편리하게 사용되며, BufferedReader는 문자 스트림(character stream)에서 텍스트를 읽을 때 버퍼링을 활용해 더 효율적으로 문자를 읽어오는 데 사용됩니다.
Scanner와 BufferedReader의 주요 차이점
| 번호 | 구분 항목 | Scanner 클래스 | BufferedReader 클래스 |
|---|---|---|---|
| 1 | 동기화(Synchronous) | 동기화되어 있지 않아 단일 스레드 환경에서만 사용하는 것이 안전합니다. | 동기화되어 있으며, 멀티스레딩 환경에서 사용하기 적합합니다. |
| 2 | 버퍼 메모리 | 1KB 크기의 작은 문자(char) 버퍼를 사용합니다. | Scanner에 비해 8KB 크기의 넉넉한 바이트(byte) 버퍼를 사용합니다. |
| 3 | 처리 속도 | 읽은 데이터를 파싱(parsing)해야 하므로 상대적으로 느립니다. | 문자 스트림만 읽으면 되므로 Scanner보다 빠릅니다. |
| 4 | 주요 메서드 | nextInt(), nextShort() 등 타입별 입력 메서드를 제공합니다. | parseInt(), parseShort() 등과 함께 래퍼(wrapper) 클래스를 이용한 변환이 필요합니다. |
| 5 | 한 줄 읽기 | nextLine() 메서드로 한 줄을 읽어옵니다. | readLine() 메서드로 한 줄을 읽어옵니다. |
Scanner vs BufferedReader 예제 코드
JavaTester.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class JavaTester {
public static void main(String args[]) throws NumberFormatException, IOException {
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter an number:");
int a = Integer.parseInt(bufferReader.readLine());
System.out.printf("You entered: " + a);
Scanner scanner = new Scanner(System.in);
System.out.println("\nEnter an number:");
a = scanner.nextInt();
System.out.printf("You entered: " + a);
}
}실행 결과
Enter an number: 1 You entered: 1 Enter an number: 2 You entered: 2
위 예제에서 볼 수 있듯이 BufferedReader는 readLine()으로 문자열을 읽은 후 Integer.parseInt()로 형 변환을 해야 하는 반면, Scanner는 nextInt()를 호출하는 것만으로 자동 파싱이 이루어집니다. 따라서 간편함이 중요하다면 Scanner를, 대량의 데이터를 빠르게 처리하거나 멀티스레드 환경에서 안전성이 필요하다면 BufferedReader를 선택하는 것이 좋습니다.