가희의자기개발블로그
Scanner와 BufferedReader의 차이점 본문
백준 문제를 풀다가 입력방식때문에 시간초과에러가 발생해서 원인도 모르고 며칠을 고민했었다. 그 원인은 Scanner의 상대적으로 느린 입력처리 때문이였는데, 그 이유를 알아보자.
이 두 클래스는 모두 입력을 받기위한 클래스라는 점에서는 동일하다. 하지만, 사용방법이나 속도 면에서 차이점이 존재한다.
BufferedReader는 InputStreamReader에 버퍼링 기능이 추가된 기능이라고 한다.
이게 뭔소리인가? InputStreamReader의 경우, 문자열을 Character단위로 불러들인다. 한글자씩 문자열을 불러들이기 때문에 굉장히 비효율적이기 때문에 이를 보완하고자 BufferedReader 기능이 추가된것이다.
BufferedReader는 사용자가 요청할 때마다 데이터를 읽어 오는 것이 아닌 일정한 크기의 데이터를 한번에 읽어와 버퍼에 보관 한 후,
사용자의 요청이 있을 때 버퍼에서 데이터를 읽어오는 방식으로 동작한다.
그렇기 때문에 속도가 향상되고 시간부하가 적다는 장점이있다.
대신에, 라인단위로 입력을 받기때문에, 공백의 경우도 String으로 인식하고 데이터 타입을 다른 타입으로 받기를 원할 경우 형변환을 직접 해줘야 한다는 수고스러움이 있다.
Scanner란, Java1.5 부터 java.util 패키지 내에 포함된 Class이며,
공란과 줄바꿈을 모두 입력값의 경계로 인식하기 때문에 좀 더 쉽게 데이터를 입력받을 수 있도록 해준다.
또한, 데이터 타입이 입력 받는 시점에서 결정되므로 별도의 Casting이 필요하지 않다는 점도 있다.
(사용하는 함수에 따라 데이터 타입이 결정)
|
BufferedReader |
Scanner |
Buffer Size |
8192 |
1024 |
Syncronized |
O |
X |
문자열 파싱 |
단순히 읽어 들임 |
문자열 파싱 가능 |
Exception |
IOException 던짐 |
IOException 숨김 |
표를 보면 BufferedReader는 Scanner에 비해 더 큰 Buffer Size를 가지고 있다.
Scanner는 문자열 파싱 기능이 제공되는 반면 BufferedReader는 단순히 읽어 들인다는 차이도 존재한다.
그렇기 때문에 상대적으로 속도는 BufferedReader가 빠르다.
아래 블로그에서 직접 코드를 작성하여 속도차이를 확인해 보았다.
[입출력] Scanner와 BufferedReader의 차이
먼저 이번 글은 Scanner와 BufferedReader에 대해 너무 깊은 부분까지는 들어가지 않고 단지 알고리즘 ...
blog.naver.com
Scanner의 경우 100만줄 입력에 2.5초가 걸린 반면 BufferedReader의 경우 0.4초 밖에 걸리지 않았다.
이글은 무조건적으로 BufferedReader를 사용하라는 의미로 작성된 포스팅이 아니다. 모든 클래스는 그 목적에 맞게 사용함이 중요한것 같다. 대신, 코딩테스트를 할때 시간을 줄이기 위해서는 BufferedReader를 사용하는게 좋을듯 하다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
FileInputStream (0) | 2020.07.20 |
---|