프로그래밍 언어/Java

Scanner, BufferedReader

Stitchhhh 2025. 2. 27. 22:49

알고리즘 문제를 풀이 할때 입력값을 받기 위해서 주로 Scanner와 BufferedReader를 사용했습니다. 그런데 최근에 메모리 초과가 발생했을 때 때 Scanner에서 BufferedReader로 교체를 하니 메모리 문제가 해결된 경험이 있습니다. 이를 계기로 Scanner와 BufferedReader에 대해 정리를 해보겠습니다.

Scanner

Scanner 클래스는 입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스입니다. 간단하게 기본형과 String 타입을 정규표현식을 사용해 파싱할 수 있습니다.

  • java.util 패키지에 속합니다. (java.util.Scanner)
  • 공백(띄어쓰기) 및 개행(줄 바꿈)을 기준으로 읽는다.(' ', '\t', '\r', '\n' 등) 원하는 타입으로 읽을 수 있습니다.
  • 버퍼의 사이즈가 1024byte(1KB)입니다.
  • 데이터를 입력받을 경우 즉시 사용자에게 전송되며 입력받을 때마다 전송되어야 하기에 많은 시간이 소요됩니다.

BufferedReader

데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스입니다. 즉, 사용자가 입력한 문자 스트림을 읽습니다.

  • java.io 패키지에 속합니다. (java.io.BufferedReader)
  • 데이터를 파싱하지 않고 String으로만 읽고 가져옵니다.
  • 버퍼의 사이즈가 8192byte(8KB)입니다.
  • 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 프로그램으로 전달하기에 Scanner보다 소요되는 시간을 절약할 수 있습니다.

Scanner와 BufferedReader의 차이점

  1. Scanner는 BufferedReader보다 타입에 구애받지 않습니다.
  2. BufferedReader는 Scanner보다 효율적인 메모리 용량을 가집니다.
  3. BufferedReader는 Scanner보다 안전합니다.
  4. BufferedReader가 Scanner보다 실행 속도가 빠릅니다.

BufferedReader가 더 빠른 이유

  1. 문자가 입력될 때마다 CPU가 하나하나 입출력을 하는 것보다 버퍼에 어느정도 쌓아두고 가득차거나 개행이 일어날 때마다 입출력을 처리하는 것이 훨씬 효율적이기 때문입니다.
  2. Scanner는 입력을 읽는 과정에서 정규식 적용, 파싱 과정을 거칩니다. BufferedReader는 String으로만(데이터를 파싱 하지 않고) 읽기 때문입니다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

비동기  (2) 2025.02.17
Thread  (2) 2025.02.16
ConcurrentHashMap  (0) 2025.02.16
LinkedHashMap  (0) 2025.02.16
equals()  (0) 2025.02.16