| 항목 | Scanner | BufferedReader |
|---|
| 속도 | 느림 (상대적으로) | 빠름 (버퍼 사용) |
| 사용 편의성 | 간단하고 직관적 | 다소 복잡 (IOException, 파싱 필요) |
| 입력 단위 | 토큰(단어) 단위 또는 줄 단위 | 무조건 문자열 줄 단위 |
| 형 변환 | nextInt(), nextDouble() 등 자동 지원 | 직접 Integer.parseInt() 등 사용해야 함 |
| 유형 | 객체 기반 (파서 역할) | 문자 스트림 기반 (속도 최적화) |
BufferedReader를 사용해야 하는 이유?
- Scanner 내부적으로 정규표현식과 파싱 로직을 포함하여 느리다
그렇기 때문에 입력을 버퍼에 모아서 처리하므로, I/O 호출 횟수가 줄고 성능이 훨씬 좋습니다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
String line = br.readLine();
sb.append("입력한 값: ").append(line).append("\n");
}
System.out.print(sb);
}
}
StringBuilder를 함께 쓰는 이유
- System.out.println()을 여러 번 쓰면 I/O 부하가 큼
- StringBuilder로 문자열을 한 번에 모아서 출력하면 훨씬 빠름
- 특히 알고리즘 문제에서 출력 속도까지 점수에 반영되는 경우 유리함
- 큰 데이터의 경우 메모리 사용량이 많을 수 있다.
BufferedWriter
| 장점 | 단점 |
|---|
| 출력 성능이 매우 뛰어남 (파일, 콘솔 모두 가능) | IOException 처리 필요 |
| 파일 출력/표준 출력 모두 활용 가능 | flush() 안 하면 출력 안 될 수 있음 |
다양한 출력 옵션 (write(), newLine()) | 문자열 가공은 어려움 (append()만 있음) |
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
String line = br.readLine();
sb.append("입력한 값: ").append(line).append("\n");
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}