Java의 Scanner와 BufferedReader

YeJi Kim·2023년 3월 6일
0

JAVA

목록 보기
3/5

코딩테스트에서 주로 사용되는 입력 클래스는 ScannerBufferedReader이다.
이 두 클래스의 특성에 대해 살펴보자!🤓



Scanner

Java.util.Scanner 클래스는 화면, 파일, 문자열과 같은 입력소스로부터 문자 데이터를 읽어오는데 도움을 줄 목적으로 JDK1.5부터 추가되었다. Scanner에는 다음과 같은 생성자를 지원하기 때문에 다양한 입력소스로부터 데이터를 읽을 수 있다.

또한 Scanner는 정규식 표현을 이용한 라인단위의 검색을 지원하며 구분자(delimiter)에도 정규식 표현을 사용할 수 있어서 복잡한 형태의 구분자도 처리 가능하다.


Scanner는 nextLine(), nextInt() 또는 nextLong()과 같이 특정 자료형의 값을 반환하는 메서드를 제공한다. Scanner에서는 이와 같은 메서드를 제공함으로써 입력받은 문자를 다시 변환하는 수고를 덜어준다.

next()는 다음 토큰까지를 반환하고 nextLine()은 현재 라인의 데이터를 반환한다.
실제 입력된 데이터의 형식에 맞는 메서드를 사용하지 않으면, InputMismatchException이 발생한다.


Scanner 클래스의 버퍼 사이즈는 1024 bytes이다.



BufferedReader

BufferedReader는 버퍼를 이용해서 입출력의 효율을 높여주는 문자기반의 보조스트림이다.
BufferedReader는 문자 기반 스트림인 Reader를 상속받았다.

Q. 보조스트림이란?🧐
A. 보조스트림은 실제 데이터를 주고받는 스트림이 아니기 때문에 데이터를 입출력할 수 있는 기능은 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다. 그래서 보조스트림만으로는 입출력을 처리할 수 없고, 스트림을 먼저 생성한 다음에 이를 이용해서 보조스트림을 생성해야 한다.

BufferedReader 클래스의 상속자는 다음과 같다. 위에서 언급했듯이 데이터를 입출력할 수 있는 기능은 없기 때문에 Reader 스트림으로부터 입력값을 받아오는 것을 알 수 있다.


대표적인 메서드로는 read()와 readLine()이 있다. readLine()은 한 줄을 읽어서 문자열로 반환한다. Scanner와 달리 특정 타입으로 데이터의 자료형을 변환해주지 않기 때문에 Integer.parseInt(), Long.valueOf()와 같이 자료형을 변환해주는 메서드를 사용해서 원하는 자료형으로 변환하는 별도의 작업이 필요하다.

read()는 문자 또는 문자 배열을 입력받아 int형(아스키코드 값)으로 반환한다. read() 메서드를 통해 9를 입력받았을 때 9의 아스키 코드인 57이 출력되는 것을 확인할 수 있다. read()와 readLine() 메서드는 IOException을 던지기 때문에 유의해야 한다.


BufferedReader 클래스의 버퍼 사이즈는 8192 bytes로 Scanner 클래스의 8배이다. 그렇기 때문에 많은 입력이 있다면 BufferedReader 클래스를 사용하는 것이 좋다.



Scanner와 BufferedReader의 속도 비교

다음 문제를 Scanner와 BufferedReader로 각각 풀어보고 속도를 비교해보자.


먼저 다음과 같이 Scanner로 문제를 해결한 경우, 208ms의 시간이 소요되었다.


BufferedReader로 문제를 해결한 경우, StringTokenizer와 Integer.parseInt()를 통해 입력값의 타입의 변환하는 작업을 추가로 수행했음에도 불구하고 124ms의 시간이 소요되었다.


그렇다면 왜 BufferedReader가 Scanner보다 더 빠를까?🤔

Scanner는 입력 받은 데이터를 즉시 사용자에게 전송하기때문에, 입력받을 때마다 데이터 전송 시간이 많이 소요되기 때문이다.
반면에 BufferedReader는 데이터를 입력으면 바로 사용자에게 전송되는 것이 아니라 버퍼라는 저장 공간에 데이터를 채우다가 버퍼가 가득 차거나 개행 문자를 만날 경우, 버퍼의 내용을 사용자에게 전송한다.
따라서 BufferedReader는 Scanner보다 빠른 입력 속도를 보여준다.




참고자료
오라클 공식문서 - Scanner
오라클 공식문서 - BufferedReader
자바의 정석(저자: 남궁 성, 출판사: 도우출판)

profile
이전의 기록들 👉 https://blog.naver.com/reviewerkyj

0개의 댓글