이 글에서는 BufferedReader와 Scanner의 차이에 대해 알아 볼 것이다.
BufferedReader와 Scanner는 모두 자바에서 문자열 입력을 목적으로 사용된다.
아마 자바를 처음 배우는 사람이라면 아마 Scanner를 많이 사용할 것이다.
BufferedReader에 대해 이야기하기 전에 InputStreamReader에 대해 알아보자
InputStreamReader는 문자열을 한 글자 단위로 읽어들인다. 이 경우 긴 문자열을 읽어 들일 때
불편하고 비효율적이다. BufferedReader란 이 단점은 보완하고자 존재한다.
BufferedReader와 Scanner의 차이는 크게 4가지가 있다.
1. 버퍼 사이즈 2. 동기화 3. 문자열 파싱 4. Exception
- | BufferedReader | Scanner |
버퍼 사이즈 | 8KB | 1KB |
동기화 | O | X |
문자열 파싱 | 읽어 들임 | 파싱 가능 |
Exception | IOException 던짐 | IOException 숨김 |
BufferedReader의 경우 8KB의 버퍼를 가져 버퍼에 입력을 저장하였다가 한 번에 전송하기 때문에 속도가 빠르다
반면 Scanner의 경우 입력이 바로 전달된다.
Space와 Enter 모두 경계로 인식하는 Scanner와 달리 BufferedReader는 Enter만을 경계로 인식한다.
[속도 비교]
[사용 방법]
BufferedReader와 Scanner은 둘 다 공통적으로 System.in을 매개변수로 받는 것을 볼 수 있다.
Scanner sc = new Scanner(System.in); // Scanner의 객체 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BufferedReader의 객체 선언
BufferedReader를 사용하려면 이와같은 import가 추가적으로 필요하다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
그리고 아래와 같이 readLine()이라는 메서드를 활용하고 BufferedReader는 Scanner와 다르게 IOException을 예외처리 해주어야 하기 때문에 throws IOException을 사용한다.
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int
*readLine() 은 리턴값이 String으로 고정되기에 다른 타입으로 입력을 받으려면 형변환이 필요함.
#BufferedWriter
BufferedWriter란 BufferedReader로 받은 값을 출력하는 방식이다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //할당된 버퍼에 값 넣어주기
String s = "abcdefg"; //출력할 문자열
bw.write(s+"\n"); //버퍼에 있는 값 전부 출력
bw.flush(); //남아있는 데이터를 모두 출력시킴
bw.close(); //스트림을 닫음
이 처럼 언언되며 끝에 flush()와 close를 호출해주어야한다.
BufferedReader와 BufferedWriter의 경우 버퍼를 사용하는 입력/ 출력이라 할 수 있다.
이 처럼 입력을 읽고 출력하는 과정에서 버퍼를 사용한다.
BufferedWriter의 출력은 Scanner와 달리 한번에 모두 출력된다.
[BufferedReader와 BufferedWriter를 활용한 예시]
- 백준 10951번
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException{
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
String str;
while( (str = br.readLine()) != null){
st = new StringTokenizer(str, " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
bw.write(a+b + "\n");
}
br.close();
bw.flush();
bw.close();
}
}
'자바 [JAVA]' 카테고리의 다른 글
자바의 프로그램 구조와 데이터 타입 (0) | 2023.01.26 |
---|---|
자바란? (0) | 2023.01.26 |
댓글