본문 바로가기
JAVA

[JAVA(자바)] Scanner 와 BufferedReader 차이

by 초이사 2022. 11. 27.

백준 3003번을 풀면서 Scanner 클래스와 BufferReader 클래스 사용으로 인한 속도 차이가 확실히 보이는 것을

보고 차이점에 대해 정리하고자 작성한다.

 

둘 다 모두 문자열을 입력받는 클래스이다. 

 

 

 

Scanner

  • java.util 패키지에 포함된 Class이다.
  • 입력받은 데이터를 원하는 type으로 가져온다. (int - nextInt() / String - next() / double - nextDouble() 등)
  • 공백 및 줄바꿈을 기준으로 읽어온다.
  • 버퍼의 사이즈는 1024byte(1KB)이다.
  • UnChecked Exception으로 별도로 예외 처리를 하지 않는다. 
    • UnChecked Exception은 컴파일 후에 런타임시 발생할 수 있는 예외를 말한다.
  • Thread unsafe 성질때문에 멀티 스레드 환경에서 문제가 생길 수 있다.
  • 입력이 키를 누르는 즉시 전달되기 때문에 입력할 내용이 길수록 시간이 더 걸린다.(입력할 때마다 전송한다.)

 

작성예시

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int a = sc.nextInt();
		
		sc.close();
	}
}

 

 

 

 

BufferedReader

  • java.io 패키지에 포함된 클래스이다.
  • 입력받은 데이터를 문자열로만 받아온다. (readLine()) -> 다른 타입의 데이터라면 형변환 필요
  • 라인 단위로 읽어온다.
  • 버퍼의 사이즈는 8192byte(8KB)이다.
  • Checked Exception으로 반드시 예외 처리를 해야 한다.
    • Checked Exception은 컴파일시 발생되는 예외를 말한다.
  • Thread safe 성질때문에 멀티 스레드 환경에서 안전하다.
  • 입력할 때마다 전송하는 것이 아니라 데이터를 한번에 읽어와서 버퍼에 보관한 후 사용자가 요청하거나 버퍼가 다차면 보내기 때문에 속도가 빠르다. 

 

작성예시

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		StringTokenizer st = new StringTokenizer(str," ");
		
		int a = Integer.parseInt(st.nextToken()); //int형 변환
	}
}

 

 

 

 

속도 차이가 나더라도 Scanner사용이 많은 이유는?

  • Scanner는 입력받으면서 데이터를 원하는 타입으로 받아오지만 BufferedReader는 무조건 String이기 때문에 별도로 형변환을 해주어야 한다.
  • BufferedReader는  Exception으로 반드시 예외 처리 해야 되기 때문에 무조건 try-catch 문이나 throws 문을 작성해야 한다.
  • 입력값이 작을 경우에는 큰 차이가 나지 않는다.

 

 

 

결론

상황에 따라 Scanner 와 BufferedReader를 쓸 수 있도록 둘 다 알아두어야 겠다. 코딩테스트의 경우에는 속도도 중요하므로 입력 받을 때 BufferedReader를 사용하는 것에 앞으로 익숙해지자.

댓글