DFS와 BFS 알고리즘을 공부하던 중, 많은 사람들이
scanner
보다BufferedReader
를 사용하여 입력 처리를 하고 있었다.
메모리 사용과 속도 측면에서 훨씬 좋은 방법인BufferedReader
에 대해 알아 보자!
컴퓨터 구조에서 CPU>메모리>하드 디스크 순으로 속도가 빠르다.
속도가 느린 입출력 장치에서 입력 처리를 받을 때마다 데이터를 넘기면 전송하는 데이터는 작고 처리하는 횟수는 많아져 비효율적이다.
이 때, 버퍼
는 두 장치의 속도 차이를 완화해주는 보조 장치이다.
버퍼가 다 찰때까지 데이터를 모아 한 번에 전송하면 효율적으로 데이터를 처리할 수 있다.
기존에 자주 사용하던 입력 방식인 scanner
는 버퍼를 사용하지 않은 입력 방식으로 키보드에 키가 입력되자마자 프로그램에 전달된다.
Scanner는 띄어쓰기와 개행문자로 경계 입력 값을 인식한다.
Scanner는 동기화가 되지 않는다. 멀티 쓰레드 환경에서 안전하지 않다.
버퍼를 사용하는 입력 방식인 BufferedReader
는 키보드 입력이 있을 때 한 문자씩 버퍼로 전송한다. 버퍼가 가득 차거나 혹은 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.
BufferedReader
는 개행 문자만 경계로 인식하고 입력받은 데이터가 String으로 고정된다.
BufferedReader는 동기화가 가능하다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
//throws IOException를 통한 예외 처리
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
//리턴 타입이 String이기 때문에 다른 타입 사용이 형변환 필요하다.
}
}
//StringTokenizer
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int nodeCnt = Integer.parseInt(st.nextToken());
int lineCnt = Integer.parseInt(st.nextToken());
// String.split() 함수
String s = br.readLine();
String arr[] = s.split(" ");
StringTokenizer
의 nextToken()
를 통해 공백 단위로 구분할 수 있다.split(" ")
으로 배열에 공백 단위로 구분하여 저장할 수 있다.import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
//throws IOException를 통한 예외 처리
BufferedWriter bw = new BufferedWriter(new outputStreamReader(System.out));
String str = "abcdef"; // 출력할 문자열
bw.write(str); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
}
}
System.out.println()
처럼 출력과 개행을 동시해 해주지 않는다.newLine()
혹은 bw.write("\n")
로 개행 처리를 해야한다.