킹이썬으로 코테 준비 시작했지만..
어차피 자바로 개발해야 되는거 맘 딱 먹고 바꾸기로 했다.
그런데 입력 받는 것부터 난관 봉착.
옆에서 고수들이 말하기를 "Scanner 말고 BufferedReader 써야 된다."
스캐너 밖에 안 써본 나는,,
이 둘의 차이를 공부하고 잘 사용해보기로 했다.
자바를 ~~ 자바라 !!!
자바로 알고리즘 문제를 풀 때 Scanner를 사용하면 시간 초과가 나는 경우가 있는데,
이때 BufferedReader를 사용해야 한다.
Scanner
Scanner 클래스는 입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스이다. 간단하게 기본형과 String 타입을 정규표현식으로 사용해 파싱할 수 있다.
Scanner의 특징
- java.util 패키지에 속한다. (java.util.Scanner)
- 공백(띄어쓰기) 및 개행(줄 바꿈)을 기준으로 읽는다.
- 원하는 타입으로 읽을 수 있다.
- 버퍼의 사이즈가 1024byte(1KB)이다.
- Unchecked(Runtime) Exception으로 별도로 예외 처리를 명시할 필요가 없다.
- Thread unsafe 성질을 지니기에 멀티스레드 환경에서 문제가 발생할 수 있다.
- 데이터를 입력받을 경우 즉시 사용자에게 전송되며 입력받을 때마다 전송되어야 하기에 많은 시간이 소요된다.
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
// System.in 통해 Scanner 객체 생성
String st = sc.nextLine();
- System.in이란
사용자로부터 입력을 받기 위한 입력 스트림이다.
Scanner 클래스 뿐 아니라 다른 입력 클래스들도 System.in을 통해 사용자 입력을 받아야 한다.
BufferedReader
데이터를 한 번에 읽어와 버퍼에 보관 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스이다. 즉 사용자가 입력한 문자 스트림을 읽는 것(read) 이라고 한다.
BufferedReader의 특징
- java.io 패키지에 속한다. (java.io.BufferedReader)
- 데이터를 파싱하지 않고 String으로만 읽고 가져온다.
- 버퍼의 사이즈가 8192byte(8KB)이다.
- Checked Exception으로 반드시 예외 처리를 명시해야 한다.(I/O Exception을 throw하거나 try/catch 해야 한다.)
- Thread safe 성질을 지니기에 멀티스레드 환경에서도 안전하다.
- 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한 번에 프로그램으로 전달하기에 Scanner보다 소요되는 시간을 절약할 수 있다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
// import java.io.*; 으로 모두 포함 가능
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String st = br.readLine();
int a = Integer.parseInt(st);
BufferedReader는 매개변수로 InputStreamReader를 사용하여 객체를 생성한다.
- InputStreamReader란?
문자 기반의 보조 스트림으로써 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜 주는 역할을 한다.
속도가 꽤나 많이 차이 난다.
Scanner는 입력 받은 즉시 전송하는 반면, BufferedReader는 입력 받은 값을 버퍼에 담아 두었다가 한 번에 프로그램으로 전송하기 때문이다.
그렇지만 버퍼리더는 개행문자(엔터)만 경계로 인식하고 입력된 데이터의 형식을 String으로 고정하기 때문에 데이터를 따로 가공해 주어야 한다. (StringTokenizer)
StringTokenizer로 다량의 데이터 입력 받기
자바에서는 String을 token 단위로 끊어주는 StringTokenizer 클래스를 제공한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
StringTokenizer st = new StringTokenizer(br.readLine());
// AB CDD EFFF GH 입력
st.nextToken() // AB
st.nextToken() // CDD
st.nextToken() // EFFF
st.nextToken() // GH
https://velog.io/@langoustine/Scanner-VS-BufferedReader
'Languages > Java' 카테고리의 다른 글
[Java] try-with-resources 예외 처리 (0) | 2024.08.22 |
---|---|
[Java] 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy) (0) | 2024.06.28 |
[Java] == 과 equals()로 문자열 비교하기 (0) | 2024.06.28 |
[Java] 자바는 컴파일 언어? 인터프리터 언어? (0) | 2024.06.27 |