[Java] 입출력 - BufferedReader와 BufferedWriter (feat. Scanner 느려!!)

eunsil·2023년 2월 19일
0

Java

목록 보기
1/6
post-thumbnail

코드업 기초 100제의 1084번 문제를 풀다가 알게된 것이다.
코드 상으로는 틀린 점이 없으나, Scanner의 느린 속도로 인해 시간 초과로 실패했던 문제다.


Scanner

Scanner sc = new Scanner(System.in)

  • 정규식을 사용해 기본 데이터타입들과 문자열을 분석할 수 있는 간단한 텍스트 스캐너
  • .useDelimiter()메서드를 사용해 원하는 구분자로 입력을 나눌 수 있음 (디폴트 구분자는 '공백')

Java를 사용하면서 '사용자에게 입력 받으세요'가 나오면 무조건 Scanner 클래스를 사용했다.
그러나 이 클래스의 속도가 느리다는 것을 인지하지 못했다.



InputStreamReader

내가 사용한 BufferedReader는 문자열을 한 문자씩 읽어 들이는 InputStreamReader버퍼링 기능이 추가된 클래스이다.

긴 문자열을 Character 단위로 읽어 들일 경우 시간, 비용 측면에서 비효율적이라 이를 보완하고자 한 것이 BufferedReader 이라는 것



BufferedReader

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

  • 문자 입력 스트림에서 텍스트를 읽고 문자와 배열을 읽을 수 있도록 문자를 버퍼링
  • read() 작업이 빈번한 경우 BufferedReader를 사용하는 것이 좋음
  • 모든 입력을 String 형태로 읽어들여 다른 타입의 경우 형변환을 해야함

BufferedWriter

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

  • 문자를 버퍼링해 문자 출력 스트림에 텍스트를 씀
  • 버퍼 크기 지정 가능
  • write() 작업이 빈번한 경우 BufferedWriter를 사용하는 것이 좋음



버퍼링을 왜 해요?

데이터 전송의 효율을 위해 ❗

입력된 문자의 정보를 버퍼링 없이 목적지로 바로 이동하는것 보다 이동 과정 중간에 메모리 버퍼를 두고, 데이터를 한 곳에 묶어 이동시키는 것이 효율적이고 빠르다.



Scanner와 BufferedReader의 속도 차이

두 입력 클래스의 메모리 점유는 대략 2배, 시간 속도 차이는 10배 가까이... 어마어마한 차이가 난다
문제 통과도 중요하지만 불필요한 메모리 사용, 느린 속도에 대해서도 신경써야함을 알게된 문제다 🧐



참고자료
Java SE 11 & JDK 11 Docs - Class Scanner
Java SE 11 & JDK 11 Docs - Class BufferedReader
Java SE 11 & JDK 11 Docs - Class BufferedWriter
BufferedReader와 Scanner

0개의 댓글