본문 바로가기
JAVA

[JAVA]Scanner / BufferedReader 차이

by whitedeveloper 2023. 8. 7.

Scanner 와 BufferedReader 클래스는 둘다 사용자 입력을 받을 수 있는 기능.

가장 큰 차이는 속도에 있다.

 

백준에서 입력 속도 비교글을 보면 평균적으로 BufferedReader 사용시에 0.6585, Scanner 사용시 4.8448초가 걸리는 차이가 있다. 데이터가 많아질 수록 성능의 차이가 발생

 

속도가 차이나는 이유 = Buffer의 사용 여부의 차이

Scanner의 경우  1KB 크기의 버퍼를 가지고 있어 입력이 바로 전달

BufferedReader는 8KB 크기의 버퍼를 가져 buffer에 입력들을 저장했다 한번에 전송하기 때문에 속도가 더 빠르다.

또한 Scanner 는 입력을 읽는 과정에서 내부에서 정규 표현식 적용, 입력값 분할, 파싱 과정을 거치기 때문에 느리다.

 

두 클래스 모두 생성할 때 System.in을 매개변수로 받는다.

System.in은 java.lang 패키지의 System 클래스이며,  System클래스의 in은 정적(static) 변수입니다.

public final class System {
    public static final InputStream in = null;
    
    ...
}

in 은 inputStream 타입의 변수임을 볼 수 있습니다.

inputStream은 java.io 패키지의 바이트 단위 입력을 위한 최상위 입력 스트립 클래스입니다.

 

System.in을 매개변수로 사용하기 때문에 사용자 입력을 받을 수 있다

 

*System.in 만을 사용하여 입력을 받는 것이 가능

import java.io.IOException;

public class Input {
    public static void main(String[] args) throws IOException {
        int input = System.in.read();
    }
}

System.in과 BufferedReader 클래스를 사용할 때는 main 옆에 throws IOException이 붙는다.

사용자의 입력이 다양한 타입으로 들어올 수 있는데, 잘못된 값이 들어올 경우 에러가 나지 않도록 예외 처리를 해줘야한다.

 

Scanner는 System.in을 생성 시에 내부에서 try-catch를 사용하여 예외 처리하기 때문에 하지 않아도 된다.

 

BufferedReader는 생성시 매개변수로 InputStreamReader를 사용

 

InputStreamReader란 문자 입력 스트림의 한 종류로 입력 장치로 부터 받은 입력 값을 자바 응용 프로그램에 전달하는 객체

자바 응용 프로그램은 입력 장치로 부터 직접 데이터를 읽지 않고 *입력 스트림을 통해 읽는다.

 

*입출력 스트림

자바 응용 프로그램과 입출력 장치를 연결하는 역할

 

입출력 스트림 종류

문자 스트림

문자 스트림에는 크게 입력 문자 스트림(...Reader) 출력 문자 스트림(...Writer)이 존재합니다.

입력 문자 스트림의 종류에는  Buffer, CharArray, Filter, InputStream, Piped가 있으며, 출력 문자 스트림에는 Buffer, CharArray, Filter, OutputStream, Piped, Print, String이 있습니다.

입력 문자 스트림의 경우 끝에 Reader가 붙으며 출력 문자 스트림의 경우 Writer가 붙습니다.

예) InputStreamReader, OuputStreamReader

 

문자 스트림은 문자(text)만 입출력하는 스트림으로 다른 데이터는 처리하지 못합니다.

바이너리로 들어온 문자 데이터가 문자 스트림을 거치면 문자로 변환됩니다.

 

바이트 스트림

바이트 스트림에는 크게 입력 바이트 스트림(...InputStream) 출력 바이트 스트림(...OutputStream)이 존재합니다.

데이터의 종류에 따라 입력 바이트 스트림에는 Audio, ByteArray, File, Filter, Object, Piped, Sequence, StringBuffer가 있으며, 출력 바이트 스트림에는 ByteArray, File, Filter, Object, Piped가 있습니다.

입력 바이트 스트림의 경우 끝에 InputStream이 붙으며 바이트 스트림의 경우 OutputStream이 붙습니다.

예) FileInputStream, FileOutputStream

 

바이트 스트림은 문자 데이터, 바이너리 데이터 상관없이 데이터를 바이너리 2진 데이터 그대로 읽고 저장 합니다.

바이트 입력 스트림의 경우 바이트 입력 스트림을 거쳐도 바이트 상태로 입출력 데이터를 단순 바이트의 흐름으로 처리합니다.