Scanner
가 한글자씩 받고 처리하는 반면에 Buffer
는 들어오는 값을 모아두었다가 한번에 쏟아낸다(flush
). 그래서 Scanner
보다 BufferedReader
와 BufferedWriter
가 빠르다.
▲note: 위에 대한 더 자세한 설명은 https://jhnyang.tistory.com/m/92
기본적으로 BufferReader
는 String
만 읽는다. 다른 데이터타입으로 받으려면 String
으로 형변환 해주어야하고 Writer
를 쓸때에도 마찬가지이다. 즉, int
를 Read & Write 하려면 먼저, String
으로 Read한 숫자를 int
로 바꿔서 변수에 담는다. 그러고나서 그 변수를 Write하려면, int
형태로 바뀐 정수를 다시 String
형태로 형변환해서 Write해야한다.
(코드 1) String 읽고 쓰기
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));
// 괄호안에 콘솔창으로 읽을건지, 파일로 읽을건지 등등에 따라 맞는 Reader & Writer를 넣는다.
String str = br.readLine();
// String이기 때문에 형변환을 안해도 된다.
bw.write(str);
// write만 하면 콘솔에 안나온다.
bw.flush();
// flush를 사용하면 한꺼번에 쏟아낸다.
// 지금은 한개만 꺼내서 쏟아낸다는게 헷갈릴수 있지만,
// for문을 사용해서 백준 15552번을 풀어보면 알수있다.
bw.close();
br.close();
// Scanner 닫듯이 이것도 닫아주자.
(코드 2) int 읽고 쓰기
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));
// 괄호안에 콘솔창으로 읽을건지, 파일로 읽을건지 등등에 따라 맞는 Reader & Writer를 넣는다.
int i = Integer.parseInt(br.readLine());;
// String 으로 Read했기 때문에 형변환을 안해도 된다.
bw.write(String.valueOf(i));
// int로 형변환된 것을 다시 String으로 형변환한다.
// write만 하면 콘솔에 안나온다.
bw.flush();
// flush를 사용하면 한꺼번에 쏟아낸다.
// 지금은 한개만 꺼내서 쏟아낸다는게 헷갈릴수 있지만,
// for문을 사용해서 백준 15552번을 풀어보면 알수있다.
bw.close();
br.close();
// Scanner 닫듯이 이것도 닫아주자.
(코드 3) 백준 15552번
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
// StringTokenizer를 선언한 이유는,
// 요구사항이 입력받을 때 한줄로 받도록 되어있기 때문이다.
// split처럼 사용할수있다.
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine(), " ");
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
bw.write(A+B + "\n");
// 개행 시켜주는 문자열인 \n을 더해주면,
// A+B는 자동으로 String으로 바뀐다.
}
bw.flush();
bw.close();
br.close();
}
}
bw.write(String.valueOf(A+B));
bw.newLine();
왜 다음과 같은 코드를 쓰면 출력이 정상적으로 되지 않을까?