백준 3003번을 풀면서 Scanner 클래스와 BufferReader 클래스 사용으로 인한 속도 차이가 확실히 보이는 것을
보고 차이점에 대해 정리하고자 작성한다.
둘 다 모두 문자열을 입력받는 클래스이다.
Scanner
- java.util 패키지에 포함된 Class이다.
- 입력받은 데이터를 원하는 type으로 가져온다. (int - nextInt() / String - next() / double - nextDouble() 등)
- 공백 및 줄바꿈을 기준으로 읽어온다.
- 버퍼의 사이즈는 1024byte(1KB)이다.
- UnChecked Exception으로 별도로 예외 처리를 하지 않는다.
- UnChecked Exception은 컴파일 후에 런타임시 발생할 수 있는 예외를 말한다.
- Thread unsafe 성질때문에 멀티 스레드 환경에서 문제가 생길 수 있다.
- 입력이 키를 누르는 즉시 전달되기 때문에 입력할 내용이 길수록 시간이 더 걸린다.(입력할 때마다 전송한다.)
작성예시
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
sc.close();
}
}
BufferedReader
- java.io 패키지에 포함된 클래스이다.
- 입력받은 데이터를 문자열로만 받아온다. (readLine()) -> 다른 타입의 데이터라면 형변환 필요
- 라인 단위로 읽어온다.
- 버퍼의 사이즈는 8192byte(8KB)이다.
- Checked Exception으로 반드시 예외 처리를 해야 한다.
- Checked Exception은 컴파일시 발생되는 예외를 말한다.
- Thread safe 성질때문에 멀티 스레드 환경에서 안전하다.
- 입력할 때마다 전송하는 것이 아니라 데이터를 한번에 읽어와서 버퍼에 보관한 후 사용자가 요청하거나 버퍼가 다차면 보내기 때문에 속도가 빠르다.
작성예시
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str," ");
int a = Integer.parseInt(st.nextToken()); //int형 변환
}
}
속도 차이가 나더라도 Scanner사용이 많은 이유는?
- Scanner는 입력받으면서 데이터를 원하는 타입으로 받아오지만 BufferedReader는 무조건 String이기 때문에 별도로 형변환을 해주어야 한다.
- BufferedReader는 Exception으로 반드시 예외 처리 해야 되기 때문에 무조건 try-catch 문이나 throws 문을 작성해야 한다.
- 입력값이 작을 경우에는 큰 차이가 나지 않는다.
결론
상황에 따라 Scanner 와 BufferedReader를 쓸 수 있도록 둘 다 알아두어야 겠다. 코딩테스트의 경우에는 속도도 중요하므로 입력 받을 때 BufferedReader를 사용하는 것에 앞으로 익숙해지자.
'JAVA' 카테고리의 다른 글
[JAVA(자바)] 리터럴이란? (0) | 2022.12.19 |
---|---|
[JAVA(자바)] 변수와 자료형 (0) | 2022.12.19 |
[JAVA(자바)] 반올림해서 소수점 원하는 자리까지 출력하기 (0) | 2022.12.01 |
[JAVA(자바)] EOF(End Of File) (0) | 2022.11.30 |
[JAVA(자바)] BufferedWriter와 StringBuilder 차이 (0) | 2022.11.30 |
댓글