Java로 알고리즘 문제를 풀때 알고있어야할 Scanner와 BufferedReader클래스의 차이점을 알아보고자 합니다.
우리가 알고리즘 문제에서 입력을 받을때는 일반적으로 두가지 클래스를 이용해 입력을 받게됩니다.
먼저 Scanner 클래스로 입력받은 문자열을 그대로 출력하는 예제를 보면서 얘기해보겠습니다.
import java.util.Scanner;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.print(str);
}
}
- Scanner 는 Space, Enter 모두를 경계로 인식하여 입력값을 쉽게 이용할 수 있습니다.
- 입력받은 Data를 파싱해서 원하는 Type으로 받아들입니다.
- 버퍼 사이즈가 1024byte 입니다.
- Thread unsafe 합니다.
- I/O exception이 자체적으로 처리됩니다.
즉, Scanner는 편리하고 이용하기 쉬운대신에 버퍼 Size가 작고 상대적으로 느리다는 것을 알 수 있습니다.
다음으로 BufferedReader 클래스로 입력을 받는 예제를 보면,
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
public class test {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(in);
System.out.print(br.readLine());
}
}
- BufferedReader는 한 줄(Line) 단위로 입력을 받습니다.
- Line 단위로 입력값의 경계를 인식하기 때문에 한 줄에 Space를 경계로 여러 값이 입력되었다면 파싱이 필수적
- 입력받는 값은 모두 String Type이므로 원하는 자료형으로 파싱이 필수적
- 자체적 Exception이 처리되지 않기 때문에 위의 예제와 같이 throws 혹은 try ~ catch를 이용해서 exception을 처리
- 버퍼 사이즈를 8192byte 까지 이용가능, 조절하지 않을 경우 Default값
- 동기화가 가능해서 Thread Safe
(2번의 경우에는 StringTokenizer라는 클래스를 이용하여 입력받은 String Line을 Space로 구분지어서 Tokenize하는 식으로 이용한다. )
BufferedReader의 경우엔 사용하기 까다로운 대신에 한번에 입력받을 수 있는 버퍼 Size가 크다는 것을 알 수 있습니다.
Scanner와 BufferedReader의 차이점을 요약해보자면,
파싱 | 버퍼 사이즈 | 예외처리 | 동기화 | |
Scanner | 기본적으로 지원 | 1024 | 기본적으로 지원 | X |
BufferedReader | 원하는 형태로 파싱해야함 | 512 ~ 8192 | 직접 해야함 | O |
적은 Data를 취급할 때는 시간의 차이점이 거의 없을 수 있지만,
많은 Data를 입력받고 취급해야할 알고리즘 풀이때는 BufferedReader를 이용하여 시간적으로 이득을 볼 수 있습니다.
- BufferSize의 차이
- Scanner 내부에서 파싱할 때 걸리는 시간 때문
'JAVA' 카테고리의 다른 글
Collection이란 (0) | 2019.06.24 |
---|---|
Map/HashMap 이란 (0) | 2019.06.24 |
객체(Object)와 인스턴스(Instance) (0) | 2019.06.14 |
배열(Array)이란? (0) | 2019.06.12 |