Note/물음표 모음
Scanner와 BufferedReader 차이
ilyadelavie
2022. 7. 12. 23:38
*본 문서에서는 콘솔 입력 시 Scanner/BufferedReader 를 사용하는 이유와 그 차이에 대해 알아본다.
KeyPoint
- BufferedReader의 빠른 처리 속도
- StringTokenizer을 이용한 데이터 가공
- Integer.parseInt() 등을 활용한 형변환
- throws IOException 예외 처리
개요
Scanner/BufferedReader 두 클래스는 입력 속도에 큰 차이가 있다. 그 이유는 두 클래스의 buffer 사용 여부 때문인데
Scanner는 1KB 크기의 버퍼를 갖기 때문에 입력이 바로 전달되는 반면 BufferedReader는 8KB 크기의 버퍼를 가지고 버퍼에 입력 값을 저장하여 한 번에 전송하기 때문에 데이터 처리 효율이 더 높고 속도도 더 빠르다.
그래서 많은 양의 데이터 입력 속도를 빠르게 처리하고 싶다면 BufferedReader가 유리하지만
Scanner가 여러 타입을 읽을 수 있는 반면 BufferReader은 리턴 값이 String으로 고정되어있기 때문에 다른 타입을 입력 받고자 한다면 형변환이 필요하며, 반드시 예외처리를 해야한다.
참고)
블로그 - 전체 글
여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일
www.acmicpc.net
기본 사용법
- readLine() 통해 입력 받기 (readLine()을 사용할 때는 예외 처리 필요)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine(); //String
int i = Integer.parseInt(br.readLine()); //int로 형변환하여 입력 받음
public static void main(String[] args) throws IOException {}
// InputStream==null 일때의 장애를 대비하기 위해
데이터 가공
BufferReader가 읽어들인 데이터는 개행(line) 단위로만 구분되기 때문에 공백 단위로 데이터를 가공하려면 별도의 작업이 필요하다.
Scanner
1 2 3 4 5 6 7 8 9 10 11 12 // 한줄 입력
for(int i=0;i<12;i++) {
sc.nextInt();
}
BufferedReader_String.split()
1 2 3 4 5 6 7 8 9 10 11 12 // 한줄 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
// s[0] = "1"; Integer.parseInt(s[0]) => 1
// s[1] = "2";
// s[2] = "3";
// .....
BufferedReader_StringTokenizer
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
//String
// AB CDD EFFF GH 입력
st.nextToken() // AB
st.nextToken() // CDD
st.nextToken() // EFFF
st.nextToken() // GH
//int
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());