Note/물음표 모음

Scanner와 BufferedReader 차이

ilyadelavie 2022. 7. 12. 23:38
*본 문서에서는 콘솔 입력 시 Scanner/BufferedReader 를 사용하는 이유와 그 차이에 대해 알아본다.

 

KeyPoint


  • BufferedReader의 빠른 처리 속도
  • StringTokenizer을 이용한 데이터 가공
  • Integer.parseInt() 등을 활용한 형변환
  • throws IOException 예외 처리

 

개요


Scanner/BufferedReader 두 클래스는 입력 속도에 큰 차이가 있다. 그 이유는 두 클래스의 buffer 사용 여부 때문인데

Scanner는 1KB 크기의 버퍼를 갖기 때문에 입력이 바로 전달되는 반면 BufferedReader는 8KB 크기의 버퍼를 가지고 버퍼에 입력 값을 저장하여 한 번에 전송하기 때문에 데이터 처리 효율이 더 높고 속도도 더 빠르다.

 


그래서 많은 양의 데이터 입력 속도를 빠르게 처리하고 싶다면 BufferedReader가 유리하지만

Scanner가 여러 타입을 읽을 수 있는 반면 BufferReader은 리턴 값이 String으로 고정되어있기 때문에 다른 타입을 입력 받고자 한다면 형변환이 필요하며, 반드시 예외처리를 해야한다.

 

참고)

 

블로그 - 전체 글

여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일

www.acmicpc.net

 

 

기본 사용법


  • readLine() 통해 입력 받기 (readLine()을 사용할 때는 예외 처리 필요)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();		//String
int i = Integer.parseInt(br.readLine());	//int로 형변환하여 입력 받음
public static void main(String[] args) throws IOException {}
// InputStream==null 일때의 장애를 대비하기 위해

 

데이터 가공


BufferReader가 읽어들인 데이터는 개행(line) 단위로만 구분되기 때문에 공백 단위로 데이터를 가공하려면 별도의 작업이 필요하다.

Scanner

1 2 3 4 5 6 7 8 9 10 11 12 // 한줄 입력

for(int i=0;i<12;i++) {
    sc.nextInt();
}

BufferedReader_String.split()

1 2 3 4 5 6 7 8 9 10 11 12 // 한줄 입력

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");

// s[0] = "1";  Integer.parseInt(s[0]) => 1
// s[1] = "2";
// s[2] = "3";
// .....

BufferedReader_StringTokenizer

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

//String
// AB CDD EFFF GH 입력
st.nextToken() // AB
st.nextToken() // CDD
st.nextToken() // EFFF
st.nextToken() // GH

//int
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());