BufferedReader / BufferedWriter는 버퍼를 이용해서 읽고 쓰는 메서드이다. 이 메서드는 버퍼를 이용하므로 Scanner보다 입력의 효율이 좋고 System.println보다 출력의 효율이 비교할 수 없을 정도로 좋아진다.
버퍼를 사용하지 않는 입력같은 경우에는 입력이 키를 누르는 즉시 바로 전달이된다고 한다.
하지만 버퍼를 사용하면 입력값의 한 문자씩 버퍼에 저장되어 전송하는데, 한 번 거쳐가므로 효율이 더 나쁜것 처럼 보이지만 사실이 아니다.
하드디스크의 원해 속도는 엄청 느리다. 뿐만아니라, 키보드나 모니터와 같은 외부장치와의 데이터 입출력은 생각보다 시간이 걸리는 작업이다.
때문에 데이터를 만든 즉시 바로 보내는것보다 데이터를 한 군데에 모아서 한꺼번에 보내는것이 효율적이고 빠르다
예시로, 공사장에 필요한 벽돌을 옮기는 작업을 한다고 생각해보면 벽돌 하나씩 옮기는게 효율적인가 아니면 수레에 한번에 담아서 옮기는게 빠른가 생각해보면 이해가 편할것이다.
알고리즘 문제를 풀기 위해서 값을 입력받을때, Scanner를 이용해 입력을 받는다.
Scanner는 띄어쓰기와 엔터를 경계로 입력 값을 인식하기 때문에 가공할 필요가 없어 사용하기 편리하다.
반면에 BufferedReader는 엔터만 경계로 인식하고 받은 데이터가 String으로 고정되어있기 때문에, 데이터를 따로 가공해야 하는 경우가 빈번하여 번거롭지만, Scanner에 비해서 상대적으로 빠르기 때문에 사용한다.
BufferedReader의 readLine()을 사용하면 데이터를 라인 단위로 읽을 수 있다.
readLine 함수의 리턴 값은 String으로 고정되기 때문에 String이 아닌 다른 타입으로 입력을 받으려면 형변환을 꼭 해줘야 한다.
그렇다면 한 줄에 공백을 기준으로 데이터를 분리하여 읽으려면 어떻게 해야할까?
Scanner는 공백단위로도 끊어주기 때문에 고려하지 않아도 되는 사항이였지만, BufferedReader를 사용하려면 StringTokenizer의 nextToken함수를 이용하거나 string클래스의 split함수를 이용하는 방법이 있다.