
일반적인 학습에서 주로 사용되는 Scanner와 코딩 테스트에서 주로 사용되는 BufferedReader에 대해 알아보며 비교해보았습니다
💡선 요약
Scanner는 입력을 읽을 때 토큰 단위로 파싱하기 때문에 내부적으로 많은 추가 연산이 발생
BufferedReader는 버퍼(buffer) 를 사용하여 대량의 데이터를 한 번에 읽고 문자열로 반환하므로 훨씬 빠르게 동작
-> 따라서BufferedReader를 사용하는 것이 유리
정규 표현식을 사용하여 기본 타입과 문자열을 구문 분석할 수 있는 간단한 텍스트 스캐너
Scanner에서 사용자 입력 뿐만 아니라, 파일, 문자열을 통해 분석할 수 있습니다.
// 사용자의 입력
Scanner sc1 = new Scanner(System.in);
while(sc1.hasNext()) {
String str = sc1.next();
System.out.println(str);
}
// 파일 입력 (long타입 작성)
Scanner sc2 = new Scanner(new File("myFile"));
while(sc2.hasLong()) {
long l = sc2.nextLong();
System.out.println(l);
}
sc2.close();
// 문자열 입력
String input = "1 2 3 4 5";
Scanner sc3 = new Scanner(input);
while(sc3.hasInt()) {
int n = sc3.nextInt();
System.out.println(n);
}
기본적으로 Scanner 클래스는 공백(space), 탭(\t), 줄바꿈(\n, \r) 등을 구분자로 사용해 입력을 분리합니다.
이를 변경하려면 useDelimiter(String pattern)메서드를 사용하면 됩니다.
예를 들어, 쉼표(,)를 구분자로 사용하고 싶다면
String input = "네이버,카카오,쿠팡";
Scanner scanner = new Scanner(input);
scanner.useDelimiter(","); // 쉼표를 구분자로 설정
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
scanner.close();
입력을 한 문자씩 읽어오며, nextInt(), next() 등 메서드를 호출할 때마다 내부적으로 버퍼 없이 바로 입력을 처리합니다.

기본적으로 공백을 기준으로 입력을 나눠 저장하고 숫자, 문자열을 읽을 때 정규 표현식을 사용하여 데이터 타입을 구분하고 변환하는 작업을 수행합니다.
→ Scanner 는 입력할 때마다 정규 표현식을 사용하여 파싱하는 과정이 존재하기에 속도가 느림
입력을 한 글자씩 읽고 분석하기 때문에 I/O 연산이 많아 성능이 떨어지게 됩니다.
BufferedReaderBufferedReader는 입력을 버퍼에 저장한 후 한 줄(String) 단위로 읽습니다.
문자 입력 스트림에서 텍스트를 읽고, 문자, 배열 및 줄을 효율적으로 읽을 수 있도록 문자를 버퍼링합니다.
BufferedReader (Java Platform SE 8 )
// 3
// 123456789
// 987654321
// 111111111
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.*in*));
int T = Integer.*parseInt*(br.readLine());
for(int i = 0; i < T; i++){
System.out.println(br.readLine());
}
}
BufferedReader 는 입력을 바로 읽지 않고, 일정 크기의 버퍼에 먼저 저장합니다.

→ 입력을 한번에 읽어서 처리하기에 속도가 빠름
readLine()을 호출하면 한 줄 전체를 문자열(String)로 변환되고, 필요에 따라 Integer.parseInt(), Double.parseDouble() 등을 사용하여 직접 변환해야 합니다.
버퍼를 사용하여 입력을 한번에 처리하므로 속도가 빠릅니다.
정규 표현식이 필요 없고, 단순히 문자열로 읽기 때문에 성능이 좋습니다.
10만개의 데이터 입력 테스트 결과 (n = 1; n <= 100'000; n++)
| Scanner | BufferedReader | |
|---|---|---|
| 입력 방식 | 한 글자씩 읽고 정규식으로 처리 | 버퍼를 사용해 한 줄씩 읽음 |
| 속도 | 느림 (I/O 연산이 많음) | 빠름 (한번에 읽음) |
| 사용법 | nextInt(), nextDouble() 등 바로 변환 가능 | readLine() 후 parseInt() 필요 |
| 코딩테스트 추천 | 비추천 (느림) | 추천 (빠름) |
💡 I/O(Input/Output) 연산이란
프로그램이 외부와 데이터를 주고받는 작업
입력은 프로그램이 외부에서 데이터를 받아오는 것, 출력은 프로그램이 외부로 데이터를 보내는 것※ I/O 연산은 메모리 내에서 이루어지는 연산에 비해 속도가 느려, I/O 연산을 최적화 하는 것이 성능 개선에 중요한 요소가 될 수 있음
💡 버퍼(Buffer)란
입출력 장치와 CPU 사이의 메모리에서 데이터를 빠르게 주고받기 위해 사용하는 임시 저장소미리 읽거나, 한번에 보내기 때문에 물리적 장치와의 직접적인 I/O연산을 최소화하여 성능을 향상