BufferedReader와 BufferedWriter

profile image 스이연 2025. 2. 15. 01:14

 

 

알고리즘 문제를 풀다가 흔히 사용하는 BufferedReader는 어떤 원리로 작동이 되고 있으며 왜 사용하는지에 대한 의문이 들었다.

자바 기초를 배울때면 나오는 Scanner 또한 입력을 받는 역할인데 왜 우리는 BufferedReader를 선호할까?

이번 기회에 Buffer의 기초와 이를 활용한 BufferedReader와 BufferedWriter 에 대해서 공부를 해보고자 한다.

Buffer

버퍼란 두개의 장치 사이에서 데이터를 전송할 때 데이터의 전송 속도나 처리 속도의 차이를 완화하는 목적으로 사용하는 기억장치다.

이때 두개의 장치란 주로 CPU와 보조 기억 장치를 말하며, CPU에 비해 보조 기억장치의 처리속도가 현저히 떨어져 효율성이 저하되는 것을 막기 위해 만들어진 저장 장치가 Buffer다. 

Buffer는 CPU 내부에 있는 캐시 메모리보다는 느리지만 보조 기억 장치보다는 훨씬 빠른 주기억장치(RAM)을 이용한다.

 

원리

보조 기억장치가 주기억 장치의 버퍼로 마련해둔 공간에 데이터를 쌓아두다가 다른 할 일을 CPU가 버퍼에 어느정도 데이터가 쌓였을 때 한번에 데이터를 처리하는 원리로 이루어져있다.

이러한 원리로 인해 버퍼는 속도 차이가 크게 나는 두 대상이 입출력을 수행할 때 효율성을 높여주는 임시 공간의 역할을 하고있다.

 

만약 Buffer를 사용하지 않는다면?

Buffer를 사용하지 않는다면 키보드에서 문자를 칠 때마다 각각의 문자들은 프로그램으로 입력이 전달된다. 즉 문자 입력 하나에 프로그램 작업 하나가 할당되는 것이다. 이때 일반적으로 프로그램 작업 하나가 처리할 수 있는 작업량보다 하나의 문자를 처리하기 위해 필요한 작업량의 크기가 매우 작기 때문에 문자 하나를 처리하기 위해 프로그램 작업 하나가 온전히 쓰이는데는 낭비가 발생한다. 결국 속도면이나 효율성이 떨어지는 것을 알 수 있다.

 

반대로 Buffer를 사용하게 된다면 키보드에 입력한 문자들은 특정 문자나 행동(엔터, 스페이스 등)이 들어오기 전까지 차례대로 버퍼에 저장된다. 그러다 버퍼의 끝을 알리는 동작이 입력되면 버퍼에 저장되어 있던 데이터들을 한번에 프로그램 하나의 작업으로 들어온다. 이전에 글자 하나당 하나의 프로그램 작업으로 효율성이 떨어지는 문제와는 달리 프로그램 작업 하나에서 날아가는 기회 비용이 적어지게 된다.

따라서 속도면이나 효율성을 고려해보면 Buffer를 사용하는 것이 좋다.

 

Buffer 사용 예시

예를 들어 영상 스트리밍을 재생하기 위해 재생버튼을 눌렀을 때, Buffer 라는 임시 공간에 빠르게 데이터를 옮기는 작업을 동시에 진행시켜 사용자가 영상을 끊김없이 볼 수 있게 한다. 만약 버퍼에 데이터를 옮기는 작업 도중 사용자의 영상 재생 속도에 따라잡히게 된다면 영상이 끊기게 되고 이를 우리는 버퍼링 걸린다고 한다.

 

BufferedReader & BufferedWriter

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;

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));
    }
 }

 

BufferedReader: 데이터 입력 / BufferedWriter: 데이터 출력

 

문자 기반의 보조 스트림으로 버퍼를 이용해 입출력의 효울을 높일 수 있도록 해주는 역할이다.

버퍼를 이용해서 한번에 여러 바이트를 입출력해 빠른 처리를 돕는다.

 

※ 보조 스트림
스트림의 기능을 보완하기 위한 것
실제 데이터를 주고 받는 스트림이 아니기 때문에 데이터를 입출력하는 기능은 없지만 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.
따라서 보조 스트림만으로는 입출력을 할 수 없고 스트림을 먼저 생성한 후 보조 스트림을 생성해야한다.

 

BufferedReader, Scanner와 무엇이 다른가요?

Scanner는 입력을 읽는 과정에서 정규 표현식을 적용하고 입력값 분할, 파싱 과정을 스스로 제공해주기 때문에 느리다는 단점이 있다.

BufferedReader는 모든 입력을 Char 형으로 버퍼를 사용해서 받는다. 한번에 전체 입력을 처리하기 때문에 속도가 빠르다는 장점이 있지만 사용자가 편하게 조작하려면 별도의 메소드를 호출해야한다.

 

즉 BufferedReader는 문자열을 단순히 읽고 저장하는 것이 중점이기 때문에 데이터를 가공 없이 빠르게 저장할때 사용하면 좋고, Scanner는 문자열을 구분하고 분삭하는 것이 중점이기 때문에 데이터를 가공할 때 사용하면 효율적이다.

 

BufferedWriter, System.out.println() 은 무엇이 다른가요?

System.out.println()은 사용자에게 편리성을 제공해준다. println()에는 줄바꿈 함수를 포함하고 있으며 이외에도 파라미터에 다양한 데이터 타입이 올 수 있도록 오버로딩이 되어 있다. 하지만 속도면에서는 효율이 떨어질 수 밖에 없다.

 

BufferedWriter는 println()과 같은 편의성을 존재하지 않지만 속도면에서 뛰어나다. 버퍼에 출력 문자열을 저장했다가 일정 때에 버퍼에 저장되어 있던 문자열을 한번에 출력한다.

 

BufferedReader Method BufferedWriter Method
close(): 스트림을 닫고 저장된 자료를 날린다. close(): 스트림을 닫고 닫기 전에 flush()를 먼저 콜한다.
readLine(): 한 줄을 읽는다. flush(): 스트림을 비운다.
mark(): 스트림의 현재 위치를 마크한다. newLine(): 줄바꿈, 개행을 한다.
reset(): 가장 최근 마크된 부분으로 스트림을 돌린다. write(char[] cbuf, int off, int len): cbuf[] 의 off위치 부터 len 길이까지 버퍼에 저장한다. 
ready(): 스트림이 입력을 읽을 준비가 되었는지 알려준다. write(int c): 한글자 c의 코드 값을 버퍼에 저장한다.
lines(): 스트림을 반환한다. write(String s, int off, int len): 문자열 s에서 off위치 부터 len 길이 만큼 버퍼에 저장한다.

 

InputStreamReader, OutputStreamReader를 사용하는 이유는?

InputStream은 우리가 InputStream.read()를 이용해서 입력을 받으려고 해도 1byte만 인식하기 때문에 한글을 제대로 읽지 못한다.

문자를 온전히 읽어들이기위해서 확장한 것이 InputStreamReader이다.

바이트 단위로 읽어들이는 형식을 문자 단위 데이터로 변환시키는 중개자 역할을 한다.

출처
 

Java BufferedReader와 BufferedWriter 사용법과 기본원리(I/O)

백준 알고리즘 문제를 풀면서 빠른 입출력을 위해 BufferedReader와 BufferedWriter를 사용한다는 사실을 알게 되었다. 프로그래머스에서 문제를 풀 때에는 직접 입출력을 작성할 필요가 없기 때문에 기

danyoujeong.tistory.com

 

 

버퍼를 사용하는 이유 ( Feat. BufferedReader vs Scanner & cache )

최근 JAVA로 알고리즘 공부를 하면서 Scanner를 사용하면 Fail이 나오지만, BufferedReader를 사용하면 통과하는 기상천외한 상황을 겪으면서.. 이와 관련된 게시글들을 찾아보게 되었다.그 과정에서 내

velog.io

 

 

[Java] 빠른 입출력 : BufferedReader & BufferedWriter

1. BufferedReader & BufferedWriter란? 간단히 말해서 BufferedReader와 BufferedWriter란 버퍼를 이용하여 데이터의 입출력을 다루는 함수입니다. 그렇다면 우선 버퍼란 무엇일까요? 전에 버퍼에 대해 정리해둔

ontheway.tistory.com

 

 

 

 

'Programming > Java' 카테고리의 다른 글

Interface와 Abstract  (1) 2025.06.15
JVM이 무엇이고 구조에 대해 알아보자  (0) 2025.05.10
원시타입과 참조 타입  (2) 2025.05.04
의존성에 대해서  (2) 2025.03.20
객체지향에게 역할과 책임이란  (1) 2025.02.11