1. 사용법
(1) Scanner
import java.util.Scanner
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int i = in.nextInt();
String s = in.next();
String sl = in.nextLine();
double d = in.nextDouble();
boolean b = in.nextBoolean();
}
}
(2) BufferedReader
import java.io.BufferedReader;
import java.InputStreamReader;
import java.io.IOException;
public class Main(){
public static void main(String[] args) throws NumberFormatException, IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine();
int i = Integer.parseInt(bf.readLine());
}
}
2. 차이점
(1) data type
Scanner는 int, String, floeat, boolean, double 등 다양한 data type을 지정할 수 있다.
BufferedReader는 line 단위의 String 만 가능하다.
Scanner는 파싱을 제공하기 때문에 우리가 따로 해줄 필요가 없다.
하지만 BufferedReader에서는 파싱을 제공하지 않기 때문에 우리가 따로 해줘야 하는 것
심지어 line 단위로 인식하기 때문에 " " 단위로 쪼개는 것도, data type을 바꾸는 것도 전부 직접 코드로 짜서 파싱해줘야 한다.
위 사용법 설명에서 보면
int i = Integer.parseInt(bf.readLine());
을 통해 int 값을 만들었다.
이건 bf.readLine()이 String이기 때문에 String 을 int로 바꾸는 과정을 거친 것이다.
그렇다보니 입력받은 String 값이 int로 바꿀 수 없는 경우도 있을 것이다.
이런 경우를 위해, throws로 예외처리를 할 수도 있고, try{ ... } catch(...){...} 예외처리를 할 수도 있다.
어쨌든, 예외처리는 해야한다.
참고로 당연히 Scanner도 예외처리를 했다.
다만 우리가 직접할 필요없이 class 안에서 이미 해둔 것
(2) 속도
사실 Scanner가 딱 봐도 더 편하다.
그럼에도 불구하고 BufferedReader 를 쓰는 가장 큰 이유는 이거다.
바로 속도!!!
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
이 긴 길이에, String 밖에 안 된다는 단점에도 불구하고 쓰는 이유는 속도이다.
Scanner보다 훨씬 빠르다.
속도를 좀 더 디테일하게 보면
java.util.Scanner => 6.068초
java.io.BufferedReader(*) => 0.934초
환경에 따라 차이는 있겠지만, 이만큼 속도 차이가 심하다는 걸 알 수 있다.
Scanner는 내부에서 파싱을 진행하기 때문에 차이가 발생한다.
(3) 동기화
여러 thread들 사이에서 Scanner instance는 공유할 수 없다.
하지만 BufferedReader instance는 공유할 수 있다.
Scanner : 동기화x
BufferedReadr : 동기화o
'Language > Java' 카테고리의 다른 글
[JAVA] InputStreamReader 란?? (+ BufferedReader) (0) | 2022.01.17 |
---|---|
[JAVA] 스트림 Stream 이란? (+ InputStream, OutputSream) (0) | 2022.01.17 |
[Java] 난수 (Random Number) 생성하기 (0) | 2022.01.14 |
[JAVA] 물음표(?)와 콜론(:)으로 if else 문 간단하게 만들기 (0) | 2022.01.14 |
[JAVA] 클래스 안에 클래스 : 이너 클래스 (Inner Class / Class In Class) (0) | 2022.01.12 |