1. Scanner
띄어쓰기와 개행문자를 경계로 값을 인식하기 때문에 가공할 필요가 없어 편리하다.
하지만 BufferedReader는 입력 받은 데이터가 String으로 고정되기 때문에 데이터를 원하는 타입으로 가공하는 작업이 필요하다.
Scanner의 경우 버퍼 size가 1024 char이기 때문에 많은 입력을 필요로 할 시 성능 상 좋지 못한 결과를 야기한다.
2. BufferedReader
BufferedReader는 개행문자만 경계로 인식하고 입력 받은 데이터가 String으로 고정된다.
따라서 데이터를 따로 가공해야하는 경우가 많지만, Scanner 보다 속도가 빠르다는 장점이 있다.
또한 BufferedReader의 size는 8192 char이기 때문에 입력 받을 값이 많다면 BufferedReader를 사용하는 것이 좋다.
3. BufferedReader가 Scanner 보다 성능이 좋은 이유
출처 : https://jhnyang.tistory.com/entry/Java-자바-입출력-BufferedReaderBufferedWriter
- 버퍼를 사용하지 않는 입력은 키보드 입력이 키를 누르는 즉시 프로그램에 전달 된다.
- 버퍼를 사용하는 입력은 키보드의 입력이 있을 때 마다 한 문자씩 버퍼로 전달 되고, 버퍼가 가득 차거나 개행문자가 나타날 경우 한 번에 프로그램에 전달한다.
💡 buffer(버퍼)
- 데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 데이터를 보관하는 임시 메모리 영역
- 입출력 속도 향상을 위해 버퍼를 사용함
4. System.out.println()보다 BufferedWriter를 사용하자
- 많은 양의 데이터를 출력할 때는 입력과 동일하게 버퍼를 사용하는 것이 좋다.
💡 주의사항
- println과 같이 개행을 한번에 해주지 않기 때문에 개행을 하기 위해서는 newLine() 메서드 또는 bw.write(”/n”)을 사용해야한다.
- buffer를 잡아 놓기 때문에 사용한 뒤 flush() 또는 close()하는 습관을 들여야한다.
- close()의 경우 출력 스트림을 아예 닫기 때문에 다른 것도 출력하려면 flush()를 사용하면 된다.
5. StringTokenizer
BufferedReader를 통해 읽어온 데이터는 개행문자 단위(Line 단위)로 나누어진다.
공백 단위로 데이터를 가공하고자 하면 따로 작업을 해주어야하는데 이때 사용하는 것이 StringTokenizer나 String.split()함수다.
- StringTokenizer의 nextToken() 함수를 사용하면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.
- String.split()함수 사용 시, 배열의 공백 단위로 끊어 데이터를 저장하여 사용할 수 있다.