본문 바로가기
JAVA/개념정리

[JAVA] BufferedReader와 Bufferedwriter

by JJH0100 2022. 10. 28.
728x90
반응형

Scanner, println

문자의 입출력시 본래 이렇게 사용하였는데 

package Main;

import java.util.Scanner;

public class ex15552 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String text = sc.next();
		
		System.out.println(text);
	}
}

자바를 처음 배울때 Scanner를 먼저 접하기 때문에 값을 입력 받을 때에는 Scanner을 사용하는 분들이 많을 것이다. 

그런데 다른 방식으로의 입출력도 가능하다.

 

 

BufferedReader, BufferedWriter

package Main;

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

public class ex15552 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String text = br.readLine();
		
		bw.write(text);
        
		br.close();
		bw.flush();
		bw.close();
	}
}

이렇게 해서도 위의 Scanner와 같은 역할을 수행한다.

 

훨씬 복잡해 보이는데 왜 이렇게 사용해야 하는가?

이는 Buffer기능 때문이다.

Buffer는 입출력을 도와주는 중간 매개체로서의 역할을 한다. Buffer는 자신의 안에 일정량의 데이터가 쌓이기를 기다렸다가 데이터량이 충분히 쌓이면 그것을 입력하거나, 출력하는 기능을 한다. 일종의 임시저장 공간인 셈.

 

Buffer에 임시저장을 했다가 입출력하는데 그게 왜 더 효율적이지?

CPU가 아주 바쁘기 때문이다.

예를 들어, 우리의 CPU가 1초에 데이터를 100개를 처리할 수 있는 능력이 있다고 가정해보자. 그런데 보조 기억 장치가 1초에 보낼 수 있는 데이터의 크기는 10밖에 되지 않는다면? 그럼 CPU는 1초에 100개를 처리할 수 있는 능력이 있는데도 불구하고 10개를 처리하기 위해 90개 만큼의 손해를 보며 일을 한다. 

버퍼는 CPU가 효율적으로 일할 수 있도록 데이터가 100개가 찰 때동안 모아뒀다가 한번에 보내주는 역할을 한다. 버퍼가 데이터를 모아두는 동안 CPU는 바쁘게 다른 일을 하다가 버퍼가 100개의 데이터를 한번에 보내주면 그것을 1초만에 처리하고 다시 다른 일을 찾아서 한다. 

용량이 작은 데이터를 전송할때는 큰 차이가 없어보이지만, 처리할 데이터의 용량이 커질수록 버퍼의 역할이 중요해진다. 그러니 많은 양의 데이터를 처리할 때 Scanner보다 BufferedReader와 BufferedWriter를 써주자.

 

BufferedReader 사용시 주의점

  1. readLine()은 리턴값이 String으로 고정 되어있다.
    readLine()은 입력값으로 들어온 데이터를 한 줄로 읽어서 String으로 바꾸는 메소드이다. 따라서 String이 아닌 다른타입으로 입력을 받을려면 형변환을 꼭 해주어야한다.
  2. 예외처리를 꼭 해주어야한다. readLine을 할때마다 try & catch를 활용하여 예외처리를 해주어도 되지만 일반적으로는 throws IOException을 통하여 작업한다.
  3. close()를 사용해주어야 한다. Buffer를 잡아 놓기 때문에 반드시 후처리를 해주어야한다.

 

BufferedWriter 사용시 주의점

  1. flush()를 사용해주어야 한다. 
    Buffer는 자신의 안에 일정량의 데이터가 쌓이기를 기다렸다가 데이터량이 충분히 쌓이면 그것을 출력하게 되어있다. 예를 들어, Buffer크기가 5라고 할 때 Buffer는 데이터의 크기가 5에서 6으로 넘어가는 시점에 안에 담아두었던 데이터를 출력하고 6을 담는다. 그럼 데이터 1-5까지는 출력이되고 6이 남아있는 시점에서 동작이 멈춰있게 된다. flush()는 안에 남아있는 데이터를 전부 출력하는 역할을 한다. 
    따라서 문자열이 마지막까지 전부 출력이 되려면 버퍼의 마지막에 반드시 flush() 처리를 해주어야한다. 
  2. close()를 사용해주어야 한다. BufferedWriter의 역시 Buffer를 잡아 놓기 때문에 반드시 후처리를 해주어야한다.
  3. 자동개행 기능이 없기 때문에 개행시 \n을 입력해주어야 한다.

 

 

2022.10.28 - [JAVA/백준알고리즘] - [백준] 15552번 : 빠른 A+B [JAVA]

 

[백준] 15552번 : 빠른 A+B [JAVA]

문제 본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다. C++을 사용하고 있고 cin/cout을 사용하

jjh93.com

 

728x90
반응형

'JAVA > 개념정리' 카테고리의 다른 글

[JAVA] 오라클 연동  (0) 2022.11.02
[JAVA] 채팅프로그램  (0) 2022.10.31
[JAVA] HashMap<K,V>  (0) 2022.10.27
[JAVA] 특수 문자 표기법  (0) 2022.10.26
[JAVA] ArrayList<E>  (0) 2022.10.26

댓글