Scanner 이 BufferedReader 보다 사용하기 더 편리하지만, 성능적으로는 BufferedReader 이 더 좋다고 한다. 또한 코딩테스트에서는 시간 초과가 뜨지 않기 위해 BufferedReader 을 사용해야 한다는 말을 들어 공부하게 되었다.
각각의 사용법과 성능 차이의 이유에 대해 알아보자.
System.in
- 표준 입력 스트림: 프로그램이 데이터를 입력받는 기본 통로
- InputStream 타입: 바이트 단위로 데이터를 읽는 클래스.
InputStreamReader
: System.in(바이트 스트림)을 문자 단위로 읽을 수 있도록 변환해주는 클래스
BufferedReader
: InputStreamReader 로 변환된 입력을 효율적으로 읽을 수 있도록 도와주는 클래스
- readLine() 같은 메서드를 제공해서 한 줄씩 읽을 수 있음
<예제코드>
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class test{
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter your name: ");
String name = bf.readLine();
System.out.println("Your name is: " + name);
}
}
<예제코드>
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = sc.nextLine();
System.out.println("Your name is: " + name);
}
}
| 항목 | BufferedReader | Scanner |
|---|---|---|
| 기본 버퍼 크기 | 8192 bytes | 1024 bytes |
| 형 변환/토큰화 지원 | ❌ 직접 파싱 필요 (String.split() 또는 StringTokenizer 사용) | ✅ 정규표현식을 통한 자동 파싱 지원 |
| 토큰화 방식 | 없음 (직접 구현 필요) | 정규표현식을 사용하여 자동 토큰화 |
| 사용 예 | 속도가 중요하거나 대용량 입력 처리 시 사용 | 간단한 입력 처리나 편의성이 중요할 때 사용 |
| 입력 처리 흐름 | 직접 문자열 읽고 직접 파싱 | nextInt() 호출 시: 1. 입력 읽기 2. 정규표현식 검사 3. 타입으로 파싱 |
참고자료
How to take input from user in Java using BufferedReader, Scanner and Console_youtube
BufferedReader와 Scanner의 성능 차이의 원인은?_tistory