[Java] 자바 입력 - BufferedReader 개념, 사용법
BufferedReader란?
BufferedReader는 Scanner와 유사하다.
BufferedReader는 입력 값이 바로 전달되지 않고 버퍼에 모아서 한 번에 전송하므로 입력 효율이 좋다.
버퍼를 사용하지 않는 입력은 키보드의 입력이 키를 누르는 즉시 프로그램으로 바로 전달된다.
버퍼를 사용하는 입력은 키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송한다. 버퍼에 차곡차곡 쌓이고 프로그램에 바로 전달되지 않는다. 버퍼가 가득 차거나, 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램으로 전달한다.
키보드 입출력은 생각보다 시간이 많이 걸리는 작업이다.
버퍼링 없이 키보드의 입력될 때마다 입력된 문자 하나씩 바로 전달하는 것보다 중간 단계로 버퍼를 두고 입력 값들을 한 번에 모아 전달하는 게 효율적이고 속도 측면에서 빠르다.
처음 자바를 배울 때 Scanner로 입력받는 것을 배웠다. Scanner로 입력받을 때는 스페이스(띄어쓰기), 엔터(개행문자)를 경계로 입력 값을 알아서 인식하므로 따로 가공할 필요 없어 사용법은 편리하다.
반면 BufferedReader는 엔터(개행문자)만 경계로 인식하고, 입력 값이 String으로 고정되기 때문에 입력 데이터를 따로 가공하는 경우가 많다. 그래도 효율이 좋기에 사용하는 것을 추천한다. 공식 문서에 문자나 배열, 라인들을 효율적으로 읽기 위해 문자들을 버퍼에 저장하고 읽는 방법을 취한다고 나와있다. 버퍼의 사이즈는 지정 가능하지만 지정 안 할 시 디폴트 값으로 설정된다.
BufferedReader 사용법
우선 BufferedReader를 사용하기 위해 다음과 같은 import가 필요하다.
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
실제 BufferedReader 사용법은 다음과 같다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
InputStreamReader는 버퍼에 입력 값을 넣는 입력 통로라고 생각하면 되고 System.in은 시스템 입력을 뜻한다.
1. BufferedReader가 개행문자를 경계로 인식하므로 readLine() 메소드를 사용하면 한 줄 단위로 읽을 수 있다.
readLine() 사용 시 주의할 점은 IOException 예외 처리를 해주어야 한다는 것이다. main 메소드에 throws 명령어를 사용해 예외처리를 한다. 이것 때문에 IOException를 import 해야한다.
2. readLine()의 반환값이 String이므로 필요 시 형변환 작업을 꼭 해주어야 한다.
한 줄 단위가 아니라 공백 단위로 입력 값을 읽고 싶다면 StringTokenizer 아니면 split을 사용하면 된다.
StringTokenizer st = new StringTokenizer(s);
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
String array[] = s.split(" ");
1. StringTokenizer로 입력 데이터를 넣어놓으면, readLine()을 통해 입력받은 값을 공백 단위로 구분해 저장해놓는다. nextToken()함수를 호출하면 공백단위로 구분하여 저장한 값을 순서대로 호출할 수 있다.
2. String.split()함수를 활용하여 readLine()을 통해 입력받은 값을 공백단위로 끊어서 배열에 넣는다.