Scanner와 BufferedReader 차이
프로그래머스에서 문제를 풀면 입력을 받고 출력을 하는 데 있어 따로 신경을 안 써도 되지만 백준에서 문제를 풀면서 직접 데이터를 입력받고 출력을 하는 데 있어 성능에 차이가 있고 이 차이로 인해서 문제를 틀릴 수 도 있어 중요하게 생각을 안 할 수가 없게 되어 사용하는 입력 클래스를 비교해 보기로 했다.
Scanner
하나의 입력값이 입력되면 즉시 바로 전달을 한다.
대신 입력 받을 때 원하는 형태의 자료값으로 정해 입력값을 받을 수 있어 직관적이고 사용값을 고정할 수 있다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String a = scanner.nextLine(); // 한줄에 있는 입력값
int b = scanner.nextInt(); // int형 입력값
float c = scanner.nextFloat(); // float형 입력값
String d = scanner.next(); // 문자형 입력값
}
}
nextLien()으로 입력을 받을 때는 앞에 입력이 있으면 주의 있게 사용해야 한다.
엔터를 이용해서 입력을 넘어 올 경우 엔터를 입력값으로 출력을 할 수 도 있다.
BufferedReader
입력값을 버퍼에 담아두었다가 한번에 프로그램에 전송한다.
입력값은 String형태로 들어와 사용할 때 필요한 형태로 변형을 시켜서 사용을 해야 한다.
입력값을 가져오기 위해서 IOException으로 에러처리를 해야 한다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String a = bufferedReader.readLine(); // 한줄의 입력값
int b = Integer.parseInt(bufferedReader.readLine()); // 입력값 int형으로 변환
// 일정한 형태로 한줄에 입력값이 주어질 경우 ex) 1 2 3
// split 활용
String[] array = bufferedReader.readLine().split(" ");
int c = Integer.parseInt(array[0]);
int d = Integer.parseInt(array[1]);
int e = Integer.parseInt(array[2]);
// StringTokenizer 활용
// 기본구분자는 띄어쓰기로 구분한다. new StringTokenizer(문자열, 구분자);
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int f = Integer.parseInt(stringTokenizer.nextToken());
int g = Integer.parseInt(stringTokenizer.nextToken());
int h = Integer.parseInt(stringTokenizer.nextToken());
}
}
프로그램을 작동을 할 때는 한 번씩 작동을 하는 부분보다 한 번에 여러 개를 하는 방법이 대게 빠른 경우가 많다.
입력속도가 적더라도 BufferedReader가 보통 빠르기 때문에 Scanner는 안 쓰는 편이다. Scanner가 직관적이고 입력값을 정해서 받을 수 있지만, 그 부분은 입력값을 사용할 때 잘 구분만해서 사용하면 BufferedReader도 다 커버가 가능하다.
이와 같은 개념으로 여러 입력같이 주어질 때, split를 사용하기보다 StringTokenizer를 이용해서 활용한다.
물론 split을 이용할 때가 유리할 때가 있어 사용을 가끔 하지만 보통은 StringTokenizer로 가능하다.
'생각정리 > Java' 카테고리의 다른 글
자바 버전 선택에 대한 이유 (0) | 2024.05.27 |
---|---|
[JAVA] 문자열 사용 (0) | 2023.11.28 |
[JAVA] 스레드 (0) | 2023.08.17 |
[JAVA] 업캐스팅, 다운캐스팅 (0) | 2023.08.17 |
[JAVA] Wrapper 클래스 (0) | 2023.08.16 |