Programming language/Java

[Java] Scanner vs BufferedReader

pogles 2023. 1. 22. 16:00

자바 입출력에서의 Scanner vs BufferedReader 의 차이점을 간략하게 정리

 

 

1. Scanner 

 

- 사용자가 입력한 텍스트를 토큰(token) 단위로 잘라 특정한 형태로 반환

  • 원하는 자료형으로 입력받을 수 있음
  • 버퍼 사이즈 1KB
  • 예외처리 불필요 (unchecked exception)
  • 멀티스레드 환경에서 문제발생 가능성있음(Thread unsafe)
  • 데이터 입력 즉시 사용자에게 전달됨 (상대적으로 많은 시간 소요)
더보기

** Thread unsafe

 

멀티스레드 환경에서는 메모리 영역을 공유하게 된다. 멀티스레드에서는 여러개의 스레드가 동시에 실행되는 것이 아니라 여러 스레드가 번갈아가면서 실행되는데(context switching), 변경되는 시점을 예측할 수 없다는 점에서 문제가 발생한다.

 

import java.util.Scanner;

Scanner sc = new Scanner(System.in);

sc.next(); // 공백(white space)를 기준으로 입력받음 , 자료형 String

sc.nextLine(); // 개행(\n)을 기준으로 입력받음. 자료형 String

sc.nextInt(); // int로 받음 : 공백기준입력

sc.nextDouble(); // double로 받음 : 공백기준입력

/*
nextInt() 사용 이후 next() 를 사용한다면 오류가 발생하므로
sc.nextLine() 이 사이에 사용되야함. 
*/

 

 

char[] arrChar = sc.next().toCharArray(); // 입력값의 각 문자를 Char 배열로 받음.

arrChar[index] = 'a'; // 값 비교(작은따옴표, char)

입력  |  abcde

arrChar |  ['a', 'b', 'c', 'd', 'e']

 

String[] arrString = sc.next().split(""); // 입력값의 각 문자를 String 배열로 받음

arrString[index].equals("a"); // 값 비교(큰따옴표, string)

입력  |  abcde

arrChar |  ["a", "b", "c", "d", "e"]

 


2. BufferedReader 

 

- 버퍼를 활용, 데이터를 한번에 읽고 버퍼에 보관한 이후에 버퍼에서 데이터를 읽어오는 방식

 

  • String 으로만 가져올 수 있음.  readLine() 만 지원
  • BufferedReader 는 매개변수로 InputStreamReader 를 사용하여 객체를 생성.
  • 버퍼 사이즈 8KB
  • 반드시 예외처리 명시해야 함 (throw / try-catch 문 필수)
  • 멀티스레드 환경에서도 문제가 발생하지 않음. (Thread safe)
  • 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한번에 전달하므로 Scanner 보다 시간을 절약할 수 있음.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;

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

String str;

try{ // 예외처리 필수
    str = br.readLine();
} catch(Exception e){
    e.printStackTrace();
}

 

 


정리

  Scanner BufferedReader
  int, long, float, double, string 등 다양한 데이터타입 입력가능  string 타입만 입력받음
  버퍼 1KB  버퍼 8KB - 처리할 입력값이 많아질수록 효율적 
  Thread unsafe Thread safe
  처리속도가 상대적으로 느림 처리속도가 상대적으로 빠름
  예외처리 불필요 예외처리 필수