ScannerBufferedReader는 문자열 입력을 읽고 처리하는 클래스이다.

테스트 케이스 커질수록 입출력 시간 차이가 난다.


Scanner

1
2
Scanner sc = new Scanner(System.in); 
int num = sc.nextInt();
cs


BufferedReader를 사용해오다가, Scanner 클래스가 새로 추가되었다. 

Scanner 클래스를 이용하면 콘솔입력을 보다 쉽게 처리 할 수 있다.



BufferedReader

1
2
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
cs

BufferedReader는 throws Exception을 선언해야만 에러 없이 사용 가능하다.


InputStreamReader는 입력을 character(키보드로 입력하는 글자 한개)로 읽어들인다. 

한 글자가 아닌 줄단위의 문자열을 입력으로 받으려면 마찬가지로 불편하기 때문에

InputStreamReader에 버퍼링 기능을 추가한 BufferedReader를 사용한다.

BufferedReader는 일정량으로 한번에 읽어온 후 버퍼에 담고, 사용자 요청시 버퍼에서 읽어온다. 


Scanner의 경우 nextInt()를 사용하면 알아서 공백 다음 숫자를 받지만, BufferedReader는 StringTokenizer를 이용한다.

1
2
3
StringTokenizer st = new StringTokenizer(br.readLine());
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
cs

입력 받은 값을 공백단위로 구분하며, StringTokenizer 선언 시 2번째 파라미터에 구분자를 추가할 수 있다.



Scanner & BufferedReader

- Scanner의 버퍼 크기는 1024 chars, BufferReader의 버퍼 크기는 8192 chars이다.

큰 파일을 읽거나 많은 입력이 있다면 BufferReader의 성능이 더 좋다.


- Scanner는 문자열을 구분하여 분석하고, BufferReader는 문자열을 단순히 읽고 저장한다.

Scanner는 내부적으로 regex(정규표현식)를 이용한다.


- Scanner는 동기화가 되지 않고, BufferReader는 동기화가 된다.

멀티 쓰레드 환경에선 여러 쓰레드가 같은 프로세스 내의 자원을 공유하기 때문에 서로의 작업에 영향을 줄 수 있다.

그렇기 때문에 Scanner는 멀티 쓰레드에 안전하지 않고, BufferReader는 안전하다.




참고 출처

- BufferedReader, BufferedWriter 를 이용한 빠른 입출력: http://snacky.tistory.com/10

- Scanner와 BufferedReader 차이: http://cocomo.tistory.com/507 [Cocomo Coding]

- Scanner와 BufferedReader 차이: http://mygumi.tistory.com/43

'Java' 카테고리의 다른 글

직렬화 (Serialization)  (0) 2018.08.04
Overloading (오버로딩)  (0) 2018.07.28
Overriding (오버라이딩, 재정의)  (0) 2018.07.28
String, StringBuffer, StringBuilder  (0) 2018.07.17
객체(Object), 클래스(Class), 인스턴스(Instance)  (0) 2018.07.16

+ Recent posts