Java BufferedReader/Writer 사용법

이윤화·2025년 9월 25일

Java

목록 보기
4/10
post-thumbnail

🚀 왜 BufferedReader/Writer를 사용할까?

코딩 테스트에서 대용량 입출력을 처리할 때는 ScannerSystem.out.println보다 BufferedReader/Writer가 훨씬 빠릅니다!

성능 차이

  • 적은 입출력: 차이 미미
  • 대량 입출력: 10~100배 성능 차이
  • 시간 제한 문제: BufferedReader/Writer 필수

📝 기본 사용법

Scanner vs BufferedReader

// Scanner 방식 (느림)
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String str = sc.next();

// BufferedReader 방식 (빠름) 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
StringTokenizer st = new StringTokenizer(line);
int n = Integer.parseInt(st.nextToken());

System.out.println vs BufferedWriter

// System.out.println 방식 (느림)
System.out.println("결과1");
System.out.println("결과2");

// BufferedWriter 방식 (빠름)
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("결과1\n");
bw.write("결과2\n");
bw.flush(); // ⭐ 중요! 마지막에 한 번만

💡 실전 예제: 대량 테스트케이스 처리

문제: T개의 테스트케이스에서 각각 A+B를 출력 (T ≤ 1,000,000)

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int T = Integer.parseInt(br.readLine());
        
        for (int i = 0; i < T; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            
            bw.write((A + B) + "\n");
        }
        
        bw.flush();
        bw.close();
        br.close();
    }
}

🔍 코드 한 줄씩 해석

Import 구문

import java.io.*;
import java.util.StringTokenizer;
  • java.io.*: 입출력 관련 모든 클래스 import
  • StringTokenizer: 공백 기준 문자열 분리 도구

클래스 및 메소드 선언

public class Main {
    public static void main(String[] args) throws IOException {
  • throws IOException: 입출력 예외 처리를 상위로 넘김

BufferedReader 생성

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • 표준 입력(System.in)을 빠르게 읽기 위한 버퍼 생성

BufferedWriter 생성

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
  • 표준 출력(System.out)에 빠르게 쓰기 위한 버퍼 생성

테스트 케이스 개수 입력

int T = Integer.parseInt(br.readLine());
  • 한 줄을 읽어서 정수로 변환

반복문 시작

for (int i = 0; i < T; i++) {
  • T번 반복

한 줄 입력 및 분리

StringTokenizer st = new StringTokenizer(br.readLine());
  • 한 줄을 읽어서 공백 기준으로 분리할 준비

토큰 파싱

int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
  • 첫 번째, 두 번째 토큰을 각각 정수로 변환

결과 버퍼에 저장

bw.write((A + B) + "\n");
  • 계산 결과를 문자열로 변환해서 줄바꿈과 함께 버퍼에 저장

출력 및 자원 해제

bw.flush();  // 버퍼 내용 한 번에 출력
bw.close();  // Writer 자원 해제
br.close();  // Reader 자원 해제

⚠️ 주의사항

1. flush()는 마지막에 한 번만!

// ❌ 잘못된 사용 (성능 저하)
bw.write("1\n");
bw.flush();
bw.write("2\n");
bw.flush();

// ✅ 올바른 사용
bw.write("1\n");
bw.write("2\n");
bw.flush(); // 마지막에 한 번만

2. IOException 처리 필수

public static void main(String[] args) throws IOException {
    // BufferedReader/Writer 사용 코드
}

3. 숫자 출력 시 문자열 변환 필요

bw.write(123);        // ❌ char로 출력됨
bw.write(123 + "");   // ✅ 문자열 변환

🎯 언제 사용할까?

Scanner/System.out.println 사용 시기

  • 간단한 문제
  • 입출력이 적은 경우
  • 빠른 프로토타이핑

BufferedReader/Writer 사용 시기

  • 시간 제한이 빡빡한 문제
  • 대량의 입출력이 있는 경우
  • 온라인 저지에서 시간 초과 발생 시

📊 성능 비교

방식100만 개 처리 시간
Scanner + println수 초
BufferedReader + Writer1초 이내

🔚 마무리

코딩 테스트에서 시간 초과가 나면 BufferedReader/Writer로 바꿔보세요!

특히 테스트케이스가 10만 개 이상인 문제에서는 거의 필수입니다.

0개의 댓글