BufferReader와 Scanner의 차이

2024. 4. 18. 21:55java

1. BufferReader란?

데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스이다. 즉 사용자가 입력한 문자 스트림을 읽는 것(read) 라고 한다.

 

※버퍼란?

데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 해당 데이터를 보관하는 임시 메모리 영역이다. 주로 입출력 속도 향상을 위해 버퍼를 사용한다.

JAVA에서는 버퍼를 BufferedReader와 BufferedWriter라는 클래스를 제공합니다.

 

BufferedReader의 특징

  • java.io 패키지에 속한다. (import java.io.BufferedReader)
  • 데이터를 파싱하지 않고 String으로만 읽고 가져온다. 

     -> 만약 int나 long형의 자료형을 이용하고 싶으면 

  • 버퍼의 사이즈가 8192byte(8KB)이다.
  • Checked Exception으로 반드시 예외 처리를 명시해야한다.(I/O Exception을 throw하거나 try/catch 해야한다.)
  • Thread safe 성질을 지니기에 멀티스레드 환경에서도 안전하다.
  • 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 프로그램으로 전달하기에 Scanner보다 소요되는 시간을 절약할 수 있다.

다소, Scanner와 비슷하다고 생각할 수 있지만,

약간의 차이가 있는 클래스입니다.

 

BufferReader 사용법

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  

 int a = Integer.parseInt(br.readLine());
 System.out.println(a);

 

코드에 대해서 간단히 설명하면, 

BufferReader 객체를 생성 후, int형의 a라는 변수에 값을 받아서, 출력하는 코드 입니다.

2. Scanner란?

Scanner 클래스는 입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스이다. 간단하게 기본형과 String 타입을 정규표현식을 사용해 파싱(parse)할 수 있다.

 

Scanner의 특징

  • java.util 패키지에 속한다. (java.util.Scanner)
  • 공백(띄어쓰기) 및 개행(줄 바꿈)을 기준으로 읽는다.(' ', '\t', '\r', '\n' 등)
  • 원하는 타입으로 읽을 수 있다.
  • 버퍼의 사이즈가 1024byte(1KB) 이다.
  • UnChecked(Runtime) Exception으로 별도로 예외 처리를 명시할 필요가 없다.
  • Thread unsafe 성질을 지니기에 멀티스레드 환경에서 문제가 발생할 수 있다.
  • 데이터를 입력받을 경우 즉시 사용자에게 전송되며 입력받을 때마다 전송되어야 하기에 많은 시간이 소요된다.

 

Scanner의 사용법

Scanner sc = new Scanner(System.in);
int a = sc.nextInt();

 

위의 코드 역시,

 

Scanner 객체를 생성해서, int형의 a라는 변수에 입력한 값을 받게하는 역할을 합니다.

 

 

BufferReader와 Scanner의 시간 비교

 

코딩 문제 사이트인 백준에 있는 문제를 BufferReader와 Scanner를 이용해 문제를 풀어봤습니다.

 

문제 10926번

 

Scanner 코드

Scanner sc = new Scanner(System.in);
String a = sc.next();
System.out.println(a+"??!");

 

BufferReader 코드

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  

 String a  = br.readLine();
 System.out.println(a+"??!");

 

Scanner(위쪽)와  BufferReader(아래) 를 이용한 코드 시간과 메모리 이용량 비교

위 사진은 사이트 백준에 있는 간단한 문제를 참고해서, 정답으로 냈는데, 시간에 차이 많이 납니다.

 

아래 사이트는 백준 문제 사이트입니다.

10926번: ??! (acmicpc.net)

 

10926번: ??!

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때

www.acmicpc.net

 

5.출처

https://velog.io/@langoustine/Scanner-VS-BufferedReader

'java' 카테고리의 다른 글

StringBuilder란?  (0) 2024.04.20
java Math 클래스  (0) 2024.04.19
(java) charAt란?  (0) 2024.04.15
(Java) next() 시리즈  (0) 2024.04.15
(java) int 와 Integer의 차이  (0) 2024.04.15