애매하게 시간이 날 때 알고리즘 문제를 푸는 습관을 들여보고있다. 그렇다 또 일을 벌인거다.
입출력 문제부터 풀어보고 있는데, BufferedReader를 사용한 코드가 Scanner를 사용한 코드보다 배로 빠른 것을 보고 포스팅을 하게 되었다.
왜 BufferedReader가 Scanner보다 빠를까?
Scanner
A simple text scanner which can parse primitive types and strings using regular expressions.
A Scanner breaks its input into tokens using a delimiter pattern, which by default matches whitespace. The resulting tokens may then be converted into values of different types using the various next methods.
위 내용은 Oracle 에서 제공하는 Java 7 API Document에서 발췌한 내용이다.
번역을 해보자면, 원시타입과 String으로 파싱이 가능하게 텍스트를 읽는 클래스인데 이 과정에서 정규 표현식을 사용을 한다.
기본적으로 공백을 delimiter로 삼아 입력값을 분할하며(이걸 토큰화(Tokenizing)), 이 토큰들은 메서드를 통해 다른 자료형으로 변환될 수 있다. 는 내용이다.
Scanner는 입력을 읽는 과정에서 정규 표현식 적용, 입력값 분할, 파싱 과정을 거치기 때문에 낮은 퍼포먼스를 보여주게 된다.
BufferedReader
Reads text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.
The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.
위 내용 역시 Oracle 에서 제공하는 Java 7 API Document에서 발췌한 내용이다.
첫번째 줄만 보더라도, 문자열이나 배열, 라인들을 읽는데 효율적임을 알 수 있다.
다만, BufferedReader를 사용하기 위해선 InputStreamReader를 생성자에 넘겨줘야하는데, 입력을 character로 받는 InputStreamReader를 버퍼를 이용해 Line 단위로 입력받을 수 있도록 해준다고 보면 된다.
BufferedReader는 입력을 버퍼에 모아두었다가 한번에 그 내용을 전달하기 때문에 빠른 속도가 나오게 된다.
'☕️ JAVA' 카테고리의 다른 글
[자바로 배우는 리팩토링 입문] 리팩토링이란? (0) | 2021.08.15 |
---|---|
Try with Resources - 손쉬운 자원 해제 (0) | 2021.03.09 |
Enum을 사용해보자 (0) | 2020.10.18 |
WebSocketSession에서 HttpSession를 얻는 방법 (0) | 2020.09.10 |
Spring AOP와 AspectJ 비교하기 (14) | 2019.12.15 |