BufferdReader

조영민·2023년 5월 3일

java

목록 보기
18/24

버퍼를 사용하지 않는 입력은 키보드의 입력이 키를 누르는 즉시 프로그램에 전달한다.

버퍼를 사용하는 입력은 키보드의 입력이 있을 때 한 문자씩 버퍼로 전송한다. 버퍼가 가득 차거나 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.

버퍼를 거쳐 출력되는 것 보다 키보드의 입력을 받는 즉시 출력하는것이 더 빠르다고 생각될 수 있지만 그렇지 않다. 하드디스크는 속도가 느리다. 그리고 외부 장치(키보드, 모니터 등)와 데이터 입출력도 생각보다 시간이 오래 걸린다. 그렇기 때문에 키보드의 입력이 있을 때마다 바로 이동시키는 것 보다는, 중간에 버퍼를 두어 한번에 묶어 보내는 것이 더 효율적이고 빠른 방법이다.

설거지를 하는 일이라고 생각하면 이해가 쉽다. 설거지 거리가 생길 때 마다 설거지를 하는 것 보다. 설거지 거리를 한 번에 모았다가 한 번에 일을 하는 것이 훨씬 효율적인 것과 비슷한 개념이다.

BufferedReader

Scanner와 달리 BufferedReader는 개행문자만 경계로 인식하고 입력받은 데이터가 String으로 고정된다. 그렇기 때문에 따로 데이터를 가공해야하는 경우가 많다. 하지만 Scanner보다 속도가 빠르다!

BufferedRead와 Scanner의 속도 차이를 잘 보여주는 예시가 있어 가져와 보았다.

10,000,000개의 0~1023 범위의 정수를 한 줄씩 읽고, 입력으로 받은 정수의 합을 출력하는 프로그램을 각각 BufferedReader와 Scanner로 구현할 때의 수행시간이다. [1]

입력 방식수행시간(초)
java.util.Scanner6.068
java.io.BufferedReader0.934

그리고 버퍼 사이즈도 Scanner가 1024 char인데 비해, BufferedReader는 8192 char(16,384byte) 이기 때문에 입력이 많을 때 BufferedReader가 유리하다.

또한 BufferedReader는 동기화 되기 때문에 멀티 쓰레드 환경에서 안전하고, Scanner는 동기화가 되지 않기 때문에 멀티 쓰레드 환경에서 안전하지 않다. (멀티 쓰레드에 대한 설명은 생략한다.)

BufferedReader 사용법

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 선언
String s = br.readLine();
int i = Integer.parseInt(br.readLine());

선언의 위의 사용법과 같이 하면된다.

입력은 readLine();이라는 메소드를 사용한다. String으로 리턴 값이 고정되어 있기 때문에, 다른 타입으로 입력을 받고자 한다면 반드시 형변환이 필요하다. 그리고, 예외처리를 반드시 필요로 한다. readLine()시 마다 try/catch문으로 감싸주어도 되고, throws IOException 을 통한 예외처리를 해도 된다.(대부분의 경우에 후자를 사용한다.)

profile
노젓는 개발자

0개의 댓글