22gamin
[Java] Scanner vs BufferedReader 본문
Java로 알고리즘 문제를 푸는 도중 Scanner 클래스를 사용했을 때 시간 초과가 날 경우 BufferedReader을 사용하여 해결할 수 있다.
Scanner 사용법
import java.util.Scanner;
public class Input {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
}
}
BufferedReader 사용법
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Input {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
}
}
- readLine()은 IOException 예외를 발생시킬 수 있기 때문에 반드시 예외처리를 해주어야한다.
- readLine은 반환값을 String으로 넘기기 때문에, 다른 타입을 사용하고 싶을 때, 형변환을 해주어야한다.
- readLine()을 사용하면 라인 단위로 값을 받아오기 때문에, split이나 StringTokenizer등을 이용, 파싱해서 사용해야함
/* split을 이용한 Parsing */
String[] stringArray = s.split(" "); //띄어쓰기를 구분자로 파싱한다.
/* StringTokenizer을 이용한 Parsing */
StringTokenizer st = new StringTokenizer(s, " ");
int i = Integer.parseInt(st.nextToken());
int j = Integer.parseInt(st.nextToken());
}
BufferReader와 Scanner의 속도 차이
~
- 위의 사진을 보면 알 수 있듯이 BufferedReader 사용시에 0.6585, Scanner 사용시에 4.8448초가 걸리는 차이를 볼 수 있음.
- 적은 양의 데이터인 경우 문제가 없겠지만, 데이터 양이 많아질수록 성능 차이가 큼
BufferReader와 Scanner의 속도 차이가 나는 이유
→ buffer 사용 여부의 차이
- Scanner는 1KB 크기의 버퍼를 갖기 때문에 입력이 바로 전달되는 반면 BufferedReader는 8KB 크기의 버퍼를 가져 buffer에 입력들을 저장하였다 한 번에 전송하기 때문에 속도가 더 빠름!
- 또한 Scanner는 입력을 읽는 과정에서 내부에서 정규 펴현식 적용, 입력값 분할, 파싱 과정 등을 거치기 때문에 속도가 느림!
- System.in은 java.lang 패키지의 System 클래스이며, System 클래스의 in은 정적 변수이다.
public final class System {
public static final InputStream in = null;
...
}
- in은 inputStream 타입의 변수이다.
- inputStream은 java.io 패키지의 바이트 단위 입력을 위한 최상위 입력 스트림 클래스이다.
- System.in을 매개변수로 사용하기 때문에 사용자(키보드) 입력을 받을 수 있다.
- System.in과 BufferedReader 클래스를 사용할 때는 main 옆에 throws IOException이 붙음
- 사용자의 입력은 여러 다양한 타입으로 들어올 수 있는데, 잘못된 값이 들어올 경우 에러가 나지 않도록 예외 처리를 해줘야함
'알고리즘' 카테고리의 다른 글
deque의 이해 및 사용법 (0) | 2024.05.09 |
---|---|
음료수 얼려 먹기/미로 탈출 [DFS/BFS] (0) | 2024.01.31 |
탐색 알고리즘 DFS/BFS (0) | 2024.01.31 |