개요
Java 알고리즘 문제 풀이에서 Scanner로 입력을 받다가 시간 초과가 발생할 때, BufferedReader 클래스로 변경하면 해결되는 경우가 있습니다.
BufferedReader 클래스는 버퍼를 이용해 입력을 한 번에 읽어오기 때문에 Scanner보다 빠른 것으로 알려져 있습니다.
하지만 BufferedReader는 String으로 입력을 받아 정수로 형변환이 필요하므로, 단일 정수나 적은 양의 정수 입력에서는 Scanner가 더 빠를 것이라는 의문이 있었습니다.
본 글에서는 적은 양의 정수 입력에서도 BufferedReader가 실제로 더 빠른지 코드를 통해 검증해보겠습니다.
BufferedReader 클래스와 Scanner의 차이
위 그림에서 알 수 있듯이, Scanner는 데이터를 읽을 때마다 시스템에 직접 요청하는 반면, BufferedReader는 버퍼에 데이터를 한 번에 불러온 후 버퍼에서 읽어오는 방식으로 작동합니다.
이러한 입력 방식의 차이로 인해 BufferedReader가 더 효율적인 입력 처리가 가능합니다.
자세한 내용은 아래의 포스팅에서 확인 가능합니다.
[JAVA] 입출력, BufferedReader, StringTokenizer, StringBuilder 알아보기
Java로 코딩테스트를 보거나 입력을 사용해야 할 때 Scanner 클래스를 사용하면 편리하지만 속도가 느리다는 단점이 있습니다. 그렇기 때문에 속도가 빠른 BufferReader 클래스를 사용을 하면 시간복
pixx.tistory.com
Scanner의 내부 동작
Scanner는 입력 처리 시 다음과 같은 복잡한 과정을 거칩니다.
- 입력 데이터를 토큰 단위로 분리
- 정규표현식을 사용한 패턴 매칭
- 입력 유효성 검사 및 예외 처리
- 데이터 타입 변환
이러한 다단계 처리 과정은 유연한 입력 처리를 가능하게 하지만, 동시에 성능 저하의 원인이 됩니다.
특히 nextInt()와 같은 메서드 호출 시마다 이 과정이 반복되어 실행됩니다.
입력 방식별 속도 비교 ✅
import java.io.*;
import java.util.*;
public class InputPerformanceTest {
public static void main(String[] args) throws Exception {
// Scanner 테스트
long startTime = System.nanoTime();
Scanner sc = new Scanner(System.in);
int n1 = sc.nextInt();
long scannerTime = System.nanoTime() - startTime;
// BufferedReader 테스트
startTime = System.nanoTime();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n2 = Integer.parseInt(br.readLine());
long bufferTime = System.nanoTime() - startTime;
// 결과 출력 (나노초 -> 밀리초 변환)
System.out.println("Scanner 실행 시간: " + scannerTime / 1000000.0 + "ms");
System.out.println("BufferedReader 실행 시간: " + bufferTime / 1000000.0 + "ms");
}
}
실행 결과
3
3
Scanner 실행 시간: 636.295833ms
BufferedReader 실행 시간: 413.656583ms
실행 결과에서 알 수 있듯이, 단일 정수 입력에서도 BufferedReader가 Scanner보다 더 빠른 성능을 보여줍니다.
실제로 BufferedReader는 Scanner보다 약 220ms 더 빠른 실행 시간을 기록했습니다. 이는 Scanner의 복잡한 내부 처리 과정이 단순 형변환보다 더 많은 시간을 소요하기 때문입니다.
결론
백준 사이트의 입력 속도 비교 자료를 보면 위와 같이 BufferedReader클래스를 통한 입력이 높은 순위에 위치하는 것을 알 수 있습니다.
그러면, 무조건 BufferedReader를 쓰면되는 것인가❓
코딩테스트나 알고리즘 문제 풀이에서 입력 처리 속도는 BufferedReader가 더 빠릅니다.
하지만 적은 양의 입력을 처리할 때는 속도 차이가 미미하므로, 문제의 입력 크기와 복잡도를 고려하여 Scanner와 BufferedReader를 적절히 선택하는 것이 좋습니다.
대량의 데이터를 처리하거나 시간 제한이 빡빡한 경우 BufferedReader를, 단순한 입력의 경우 가독성이 좋은 Scanner를 사용하는 것이 좋을 것 같다는 개인적인 생각입니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2025.02.10 - API와 Endpoint 차이점 알아보기 (0) | 2025.02.10 |
---|---|
[TIL, 일일 회고] 2025.02.09 - MySQL : CONCAT_WS로 문자열 손쉽게 결합하기 (0) | 2025.02.09 |
[TIL, 일일 회고] 2025.02.07 - VO와 DTO는 같은 의미인가❓ (1) | 2025.02.07 |
[TIL, 일일 회고] 2025.02.06 - 호출 스택(Call Stack)의 동작 원리와 예제로 이해하기 (0) | 2025.02.06 |
[TIL, 일일 회고] 2025.02.05 - 하노이 탑 알고리즘, 왜 재귀여야 할까❓ (0) | 2025.02.05 |