Java 입출력: BufferedReader & BufferedWriter 정리

상곤·2024년 8월 26일

Algorithm

목록 보기
1/4
post-thumbnail

Java에서 입출력 처리는 성능 최적화에 중요한 요소다. BufferedReaderBufferedWriter는 버퍼를 사용하여 입출력을 보다 빠르고 효율적으로 처리할 수 있게 도와준다. 이제 이 두 클래스를 자세히 살펴보자.


1. BufferedReader & BufferedWriter란?

BufferedReaderBufferedWriter는 각각 입력과 출력을 버퍼를 사용해 처리하는 클래스다.

  • BufferedReader는 입력을 버퍼에 담아 한 번에 읽어들이는 역할을 한다.
  • BufferedWriter는 출력을 버퍼에 담아 한 번에 내보내는 역할을 한다.

버퍼를 사용하는 이유

입출력을 버퍼 없이 처리하면, 키보드 입력이 발생할 때마다 프로그램으로 바로 전달된다.
하지만 이는 비효율적일 수 있다.
하드디스크나 외부 장치(모니터, 키보드 등)의 입출력 속도가 느리기 때문이다.
따라서 중간에 버퍼를 두어 한 번에 묶어 처리하는 것이 더 효율적이다.


2. Scanner와 BufferedReader 비교

ScannerBufferedReader는 모두 입력을 처리하는 도구지만, 각각의 특성과 용도가 다르다.

  • Scanner는 띄어쓰기와 개행문자를 기준으로 입력을 구분해 처리한다. nextInt(), nextLine() 등 다양한 메서드를 제공하여 입력받은 값을 특정 타입으로 쉽게 변환할 수 있다. 하지만 버퍼 크기가 1024 char로 제한되기 때문에, 대량의 입력을 처리할 때는 성능이 저하될 수 있다.

  • BufferedReader는 개행문자만을 기준으로 입력을 처리하며, 모든 입력 데이터를 String으로 받아온다. 추가적인 데이터 가공이 필요할 수 있지만, Scanner보다 속도가 빠르다. 또한 동기화(Synchronized)되어 있어 멀티쓰레드 환경에서 안전하다.


3. BufferedReader 사용법

BufferedReader를 사용하는 방법은 매우 간단하다. 아래 코드를 참고하면 된다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언

        // 문자열 입력 받기
        String s = br.readLine(); // 입력: Hello World
        System.out.println("You entered: " + s); // 출력: You entered: Hello World

        // 정수 입력 받기
        int i = Integer.parseInt(br.readLine()); // 입력: 123
        System.out.println("You entered: " + i); // 출력: You entered: 123
    }
}

readLine() 메서드를 사용하여 입력을 받는다.
반환 값은 String으로 고정되어 있으므로, 다른 타입으로 변환하려면 형변환이 필요하다.
예외 처리를 위해 throws IOException을 사용한다.

데이터 가공 방법

BufferedReader로 읽어온 데이터는 기본적으로 개행문자 단위로 구분된다.
만약 공백 단위로 데이터를 나누고 싶다면 추가 작업이 필요하다.
StringTokenizerString.split()을 사용하여 데이터를 가공할 수 있다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // StringTokenizer 사용
        StringTokenizer st = new StringTokenizer(br.readLine()); // 입력: 5 10
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        System.out.println("N: " + N + ", M: " + M); // 출력: N: 5, M: 10

        // String.split 사용
        String input = br.readLine(); // 입력: Hello world this is Java
        String[] arr = input.split(" "); // 공백 기준 분리
        System.out.println("Using String.split():");
        for (String word : arr) {
            System.out.println(word);
        }
    }
}

4. BufferedWriter 사용법

BufferedWriter는 출력할 데이터를 버퍼에 담아 한 번에 출력하는 방식으로 성능을 향상시킨다.

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
        String str = "abcdef"; // 출력할 문자열
        bw.write(str); // 출력
        bw.newLine(); // 줄바꿈
        bw.flush(); // 버퍼에 남아 있는 데이터 출력
        bw.close(); // 스트림 닫기
    }
}

System.out.println() 대신 BufferedWriter를 사용하면 많은 양의 데이터를 처리할 때 유리하다.
BufferedWriter는 자동으로 개행을 하지 않으므로, newLine() 또는 \n을 사용하여 직접 개행해야 한다.
또한, 반드시 flush() 또는 close()를 사용하여 버퍼에 남아 있는 데이터를 출력해야 한다.

이렇게 BufferedReaderBufferedWriter에 대해 알아보았다. Java에서 효율적인 입출력을 위해 이 두 클래스를 적절히 활용하면 좋다.

profile
🫠

0개의 댓글