Scanner와 BufferedReader는 문자열 입력을 읽고 처리하는 클래스이다.
테스트 케이스 커질수록 입출력 시간 차이가 난다.
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 |