![[Java] Scanner Vs BufferedReader](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlVy0U%2FbtsIqNKjYYo%2FfHeN9SopQjSdBGP4OafDN0%2Fimg.png)
[Java] Scanner Vs BufferedReaderJava2024. 8. 11. 18:49
Table of Contents
아래의 백준 문제를 보면, Scanner와 BufferedReader의 입출력 방식에 따른 속도 차이가 있다고 합니다. BufferedReader와 Scanner의 입력 방식에 어떤 차이가 있는지, 그리고 속도가 왜 차이나는지 궁금하여 공부해보고자 합니다.
https://www.acmicpc.net/problem/15552
Scanner
Scanner 클래스는 java.util 패키지에 포함되어 있으며, Java에서 입력을 읽기 위해 사용되는 클래스입니다. 주로 콘솔 입력을 처리하는 데 사용되지만, 파일로부터 데이터를 읽을 때도 사용됩니다.
특징
- Scanner는 표준 입력(System.in), 파일, 문자열 등 여러 소스로부터 입력을 받을 수 있습니다.
- 다양한 데이터 타입으로 읽고 파싱할 수 있어 코드가 간결해집니다.
- 기본적으로 Scanner는 공백(whitespace)을 구분자로 사용합니다. 공백, 탭, 개행 문자 등을 기준으로 입력을 분리합니다.
- 내부 버퍼의 크기는 1024byte(1KB) 입니다.
- 데이터 입력 시 즉시 사용자에게 전송되며, 입력받을 때마다 전송이 이루어지므로 시간이 소요될 수 있습니다.
코드 예시
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
double D = sc.nextDouble();
String S = sc.nextLine();
}
}
- System.in: 사용자로부터 입력을 받기 위한 입력 스트림
단점
- Thread-unsafe 하기에 멀티스레드 환경에서 안전하지 않습니다.
- BufferedReader에 비해 실행 속도가 느립니다.
BufferedReader
BufferedReader 클래스는 java.io 패키지에 포함되어 있으며, 텍스트 데이터를 읽기 위해 사용되는 클래스입니다.
특징
- 데이터를 파싱하지 않고 String 타입으로만 읽어옵니다.
- 내부 버퍼의 크기는 8192byte(8KB) 입니다.
- 내부적으로 버퍼를 사용하여 데이터를 한 번에 읽어오며, 이를 통해 I/O 작업의 빈도를 줄이고 성능을 향상시킵니다.
- Thread-safe 하기에 멀티스레드 환경에서 안전합니다.
- Scanner에 비해 속도가 빠릅니다.
코드 예시
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
double D = Double.parseDouble(br.readLine());
String S = br.readLine();
br.close()
}
}
- InputStreamReader: 바이트 스트림을 문자 스트림으로 변환해주는 클래스
단점
- String 형식으로만 읽기 때문에, 특정 데이터 타입으로 형변환을 위해 추가적인 코드 작성이 필요합니다.
요약
특징 | Scanner | BufferedReader |
성능 | 상대적으로 느림 | 빠름 |
사용 용이성 | 다양한 데이터 타입 지원 | 기본적인 문자 읽기 |
구분자 지원 | 구분자 설정 가능 | 기본적으로 줄 단위 읽기 |
메모리 사용 | 상대적으로 많음 | 상대적으로 적음 |
정규 표현 | 지원 | 지원하지 않음 |
속도 측정
백준님이 작성하신 입력 속도 비교표를 보면, BufferedReader가 0.6585초, Scanner는 4.8448초로 둘 클래스 간의 시간 차이가 생각보다 큰 것을 확인할 수 있습니다.
이를 직접 확인하기 위해 아래의 백준 문제를 BufferedReader와 Scanner를 각각 사용하여 풀어보았습니다.
https://www.acmicpc.net/problem/15552
BufferedReader
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringTokenizer st;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < T; i++) {
st = new StringTokenizer(br.readLine()," ");
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
sb.append(A + B).append("\n");
}
System.out.println(sb.toString());
br.close();
}
}
Scanner
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < T; i++) {
int A = sc.nextInt();
int B = sc.nextInt();
sb.append(A + B).append("\n");
}
System.out.println(sb.toString());
sc.close();
}
}
BufferedReader와 Scanner를 사용하여 문제를 풀었을 때, BufferedReader를 사용한 코드가 메모리와 시간 측면에서 더 우수한 성능을 보였음을 확인할 수 있습니다.
참고 자료
'Java' 카테고리의 다른 글
자바 직렬화 알아보기 (2) | 2024.06.22 |
---|---|
[Java] Arrays.sort() 알아보기 (0) | 2023.04.26 |
@Kyko :: Kyko dev_story
느리더라도 단단하게 성장하고자 합니다!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!