-
[Java] Scanner 와 BufferedReader의 차이점Java 2021. 11. 5. 13:45728x90
두 클래스는 모두 자바에서 입력을 받는 데 사용이 됩니다.
BufferedReader
우선 BufferedReader는 InputStreamReader에 버퍼링 기능이 추가된 Class입니다.
사용자가 요청할 때마다 데이터를 읽어 오는 것이 아닌 일정한 크기의 데이터를 한 번에 읽어와 버퍼에 보관한 후, 사용자의 요청이 있을 때 버퍼에서 데이터를 읽어오는 방식으로 동장 합니다.
입력받은 타입은 String 타입으로 공백의 경우에도 String으로 인식하여 받아들입니다.
InputStreamReader란?
문자열은 character 단위로 읽어 들입니다. 이는 긴 문자열을 읽을 때 비효율적이어서 이를 보완하고자 BufferedReader가 존재합니다.
Scanner
공백과 줄 바꿈을 모두 입력값의 경계로 인식하며, 데이터 타입이 입력받는 시점에서 결정되므로 별도의 형 변환이 필요하지 않습니다.
BufferedReader와 Scanner의 차이점
- Scanner(1024 chars)에 비해 BufferedReader(8192 chars)가 더 큰 Buffer Size를 가지고 있습니다. 따라서 긴 문자열이 포함된 파일을 읽을 때는 BufferedReader가 좋습니다.
- Scanner는 여러 가지 데이터 타입을 받을 수 있지만 BufferedReader는 String 값 밖에 받지 못합니다. 즉, Scanner는 문자열을 구분하여 분석하는 파싱이 가능합니다.
- BufferedReader의 경우 동기화를 사용하지만 Scanner는 사용하지 않습니다. BufferedReader는 동기화되므로 여러 스레드에서 안전하게 수행할 수 있습니다. 하지만 Scanner는 안전하지 않으므로 외부에서 동기화해야 합니다.
- BufferedReader는 I/O exception을 자체적으로 처리하지 못해서 throw 혹은 try ~ catch를 이용해야 하지만 Scanner 같은 경우에는 I/O exception을 자체적으로 처리합니다.
수행 시간 차이
다음 그림은 10,000,000 개의 정수를 입력받고 입력받은 정수의 합을 출력하는 코드의 입력방식에 대한 수행 시간의 차이입니다.
따라서 BufferedReader의 속도가 빠르다는 것을 알 수 있으며 앞으로 입력에서 BufferedReader를 사용하기로 결정했습니다.
BufferedReader 먼저 존재했는데 왜 Scanner는 등장하였을까?
int, double 등과 같은 여러 데이터 타입을 입력받는 가장 쉬운 방법으로 등장한 것 같으며 시간이 제약이 있는 시나리오에 대한 입력 방법을 원하는 경우에는 그다지 효율적이지 않다고 합니다.
즉, 여러 가지 데이터 타입을 받기 원해서 Scanner가 등장하게 되었습니다.
출처
https://friends-aihaja.tistory.com/entry/1-BufferReader-VS-Scanner-%EC%B0%A8%EC%9D%B4%EC%A0%90
https://algospot.com/forum/read/2496/
https://www.geeksforgeeks.org/scanner-class-in-java/
'Java' 카테고리의 다른 글
[Java] 공식문서 보는 법 (0) 2021.11.07 [Java] 자바 컬렉션 프레임워크(Java Collections Framework) (0) 2021.11.07 [Java] equals 와 ==의 차이점 (0) 2021.11.03 [Java] 자바의 Hello World (0) 2021.10.29 [Java] 자바의 특징 (0) 2021.10.29