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 | |
처리속도가 상대적으로 느림 | 처리속도가 상대적으로 빠름 | |
예외처리 불필요 | 예외처리 필수 |