자바

Scanner VS BufferedReader

khw7385 2024. 9. 6. 02:07

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