[Java] BufferedReader와 BufferedWriter

지니·2024년 7월 14일

JAVA

목록 보기
2/9
post-thumbnail

처음에 java를 배우면서 Scanner와 System.out.println();로 입력과 출력을 배웠다.

그런데 몇몇 알고리즘 문제를 풀 때, Scanner를 사용하면 시간초과가 발생해 문제가 틀리는 경우가 있었다. 아무리 생각해도 코드에 오류가 존재하지 않는다고 생각해서, 정답인 코드를 보니 Scanner가 아닌 BufferedReader를 사용하고 있었다.그리고 출력할 때는 BufferedWriter를 사용하고 있었다.

그렇다면❗
BufferedReader & BufferedWriter와 Scanner & System.out.println()의 차이는 무엇이며 어떤 방식으로 사용하면 될까?


1. 사전 내용

(1) Buffer : 데이터를 임시 저장하는 공간으로 입출력 속도를 향상시키기 위해 사용한다.

(2) BufferedReader: 버퍼를 사용한 입력 클래스

(3) BufferedWriter: 버퍼를 사용한 출력 클래스

그렇다면 여기에서, 왜 Buffer를 사용하는게 속도를 향상시킬까?

마트를 가서 총 10개의 물건을 사야한다고 하자.
이 경우에 첫번째 물건을 고르고 계산하고 , 두번째 물건을 고르고 계산하는 방식을 10번 반복하면 정말 시간이 많이 걸릴 것이다.
반면에 장바구니에 10개의 물건을 모두 넣고, 한번에 계산하면 훨씬 적은 시간이 걸릴 것이다.

이와 비슷하게 사용자가 요청할 때마다 데이터를 읽거나 출력하는 것보다, 사용자의 요청을 한번에 받고 데이터를 읽거나 출력하는 것이 속도면에서 훨씬 이득인 것이다.


2. BufferedReader

(1) BufferedReader의 특징

  • Scanner에 비해 속도가 매우 빠르다.
  • 대량의 데이터를 입력받아야 할 때, 사용하면 좋다.
  • readLine();과 close(); 메소드가 자주 사용된다.
  • 예외 처리 필요

(2) BufferedReader의 단점

  • Scanner에 비해서 코드가 매우 길어진다.
  • BufferReader의 경우에는 입력 받은 데이터가 String으로 고정되기 때문에, 자료형을 변경해주는 작업이 필요하다.
  • BufferReader의 경우 개행문자만 경계로 인식하기 때문에, 가공해서 사용하는 과정이 필요하다.

(3) BufferedReader의 사용

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

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

		// 입력 데이터가 String이기 때문에 다른 자료형을 사용하기 위해선 형변환이 필요
		int a = Integer.parseInt(br.readLine());
		int[] arr = new int[a];

		// StringTokenizer: 문자열을 구분자를 이용해 분리할 때 사용하는 클래스
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		for(int i=0; i<a; i++) {
			arr[i]=Integer.parseInt(st.nextToken()); // 공백으로 문자를 구분해줌
		}
	}
}

3. BufferedWriter

(1) BufferedWriter 특징

  • System.out.println();에 비해 속도가 매우 빠르다.
  • close(); / flush(); / write(); 이 메소드들이 자주 사용된다.
  • 예외 처리 필요

(2) BufferedWriter 단점

  • System.out.println();에 코드가 길어진다.
  • System.out.println(); 처럼 개행문자가 자동적으로 생기지 않기 때문에, 개행문자를 넣고 싶은 경우에는 따로 메소드를 써줘야 한다.

(3) BufferedWriter 사용

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

public class Main {
	public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String s1 = "Hello World~!";

        bw.write(s1+"\n"); // 출력
        bw.flush(); // 버퍼에 남은 값 출력과 비우기
        bw.close(); // 스트림 닫기
	}
}

참고 블로그

https://ontheway.tistory.com/64

https://terianp.tistory.com/19

0개의 댓글