[JAVA] BufferedReader, BufferedWriter
BufferedReader = 버퍼를 이용한 입력
BufferedWriter = 버퍼를 이용한 출력
이 둘은 입력과 출력을 도와주는 클래스이다.
간단히 사용할 수 있는 Scanner와 그 기능이 비슷하다고 할 수 있다.
하지만 Scanner와 어떤 차이가 있을까?
Scanner는 입력과 동시에 프로그램에 하나하나 전송이 되지만 BufferedReader는 입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장해 둔다. 프로그램은 외부의 입력 소스로부터 읽는 대신 버퍼에 저장된만큼 한번에 읽어들여 읽기 성능과 속도가 향상되는 이점이 있다.
자 그럼 이제 코딩으로 들어가보겠습니다.
구구단을 출력하는 프로그램 코딩을 예를 들어보겠습니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("구구단 중에서 출력하고 싶은 단을 입력하시오");
bw.flush(); //다음 출력을 위해 비워야함
StringTokenizer st = new StringTokenizer(br.readLine()); //readLine : 라인 전체를 읽음
int num = Integer.parseInt(st.nextToken()); //nextToken 앞에서부터 순서대로 토큰을 받음
int i = 1;
while(i<10) {
bw.write(num + " X " + i + " = " + num*i +"\n");
bw.flush(); //출력이 반복 진행되므로 반복마다 비워야함
++i;
}
}
}
구구단 중에서 출력하고 싶은 단을 입력하시오 : 9
9 * 1 = 9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
먼저 상단에 보시면 import 해야하는 것들이 많습니다. 이런경우 import java.io.*; 라고만 써도 io패키지에 속하는 모든 클래스를 포함시킬 수 있습니다. util 패키지도 import java.util.*; 로 동일합니다.
그리고 main메소드에 throws Exception 을 넣어줘야하는 것 잊으면 안됩니다. (이부분[예외처리]에 대해서는 기회가 되면 포스팅 해보겠습니다.)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
이와 같이 입력과 출력을 위해 객체를 생성하여 필요할 때마다 사용할 수 있도록 합니다.
bw.write() 를 통해 "구구단 중에서 출력하고 싶은 단을 입력하시오" 라는 문장을 출력하고 있습니다.
bw.flush() 는 버퍼를 비워주는 메소드 입니다. (여기서는 문장출력 후 입력 값을 버퍼에 새로 담아야하기 때문에 비워주어야 합니다.)
다음으로 StringTokenizer의 객체를 생성하여 입력 라인을 읽고있습니다. 여기서는 단하나의 숫자만 입력할 수 있게 코딩한 프로그램이기 때문에 토큰을 사용할 필요가 없지만 숫자 여러 개를 입력받아 진행하는 코딩의 경우 이렇게 토큰을 사용하면 편리합니다 때문에 여기서는 아래와 같이 StringTokenizer 객체 생성 없이 바로 라인을 읽어들여 변수에 넣어도 하나의 숫자이기 때문에 괜찮습니다.
//StringTokenizer st = new StringTokenizer(br.readLine()); //readLine : 라인 전체를 읽음
int num = Integer.parseInt(br.readLine()); //nextToken 앞에서부터 순서대로 토큰을 받음
여기서 BufferedReader를 통해 읽은 데이터는 문자(String)형으로만 받기 때문에 위와 같이 정수 변환 메소드인 parseInt()를 활용하여 변수에 담아야 합니다
필자도 처음엔 Scanner를 통해 입출력을 했는데 지금은 간단한 코딩이라도 Buffer를 사용합니다. (규모있는 프로젝트를 수행하면 무조건 사용하는 것이 좋고.. 무엇보다 코딩의 고수가 되기 위해...)
다음엔 더 유익한 내용으로 돌아오겠습니다!