개발자가 되고 싶은 개발자

[Java] Buffer를 이용한 입출력 본문

Dev/Java & Spring

[Java] Buffer를 이용한 입출력

Fullth 2020. 2. 18. 21:00

안녕하세요, 오늘은 실무에서 자주 사용되는 BufferedReader에 대해 알아보겠습니다.

 

주로 입력 받을 때 사용하는 Scanner에 비해 상대적으로 빠른 속도를 보여줍니다.

 


버퍼란 무엇일까

버퍼링이라는 말 덕분에 버퍼라는 단어는 많이 들어보셨을 거라 생각됩니다. 

 

컴퓨팅에서의 '버퍼'는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안,

일시적으로 그 데이터를 보관하는 메모리의 영역을 의미합니다.

 

다른 말로는 '큐'라고도 표현합니다.

 

https://ko.wikipedia.org/wiki/%EB%B2%84%ED%8D%BC_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)

 

버퍼 (컴퓨터 과학) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨팅에서, 버퍼(buffer, 문화어: 완충기억기)는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역이다. 버퍼링(buffering)이란 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작을 말한다. 다른 말로 '큐(Queue)'라고도 표현한다. 버퍼는 컴퓨터 안의 프로세스 사이에서 데이터를 이동시킬 때 사용된다. 보통 데이터는 키보드와 같은 입력 장치로부터 받거나 프린터와 같

ko.wikipedia.org

 

 

 

 

 

 


언제 사용하면 좋을까??

 

주로 대용량 데이터 처리시에 사용됩니다.

 

간단한 프로그램을 작성할 때는, 데이터 형을 가공할 필요가 없는 Scanner을 사용하는 것이

적합하다고 생각합니다.

 

 

 

 

 

 


어떻게 더 빠를까??

받는 즉시 처리하지 않고, 보관했다가 처리하는데 어떻게 더 빠를까? 라고 생각하실 수도 있습니다.

 

예를 들어보겠습니다, 기생충의 기우네 집이 폭우로 인해 물에 잠겻습니다.

 

두 손으로 한 번씩 여러 번 왔다갔다 퍼내는 것과, 양동이에 모아서 한꺼번에 퍼내는 것.

둘 중에 어느 것이 더 효율적일까요?.

 

물론 상황에 따라 어떤 것이 효율적인지는 다르겠지만요!

 

 

 

 

 

 


Scanner와의 비교.

백준 알고리즘 문제의 2741번을 예시로 비교해보겠습니다.

우선 Scanner를 이용해서 작성해보았습니다.

import java.util.Scanner;

public class Main {

	private static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		int N = sc.nextInt();

		for (int i = 1; i <= N; i++) {
			System.out.println(i);
		}
	}
}

Scanner를 이용.

코드 길이는 236, 시간은 672ms 가 나왔습니다.

 

다음은 Buffer를 이용해서 작성해보도록 하겠습니다. 

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

public class Main {

	private static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		
		for (int i = 1; i <= N; i++) {
			bw.write(i+"\n");
		}
		
		bw.flush();
		bw.close();
		
	}
}

Buffer를 이용.

코드 길이는 644, 시간은 232ms가 나왔습니다.

코드길이는 3배 정도 늘었지만, 속도는 3배 정도 줄어드는 결과를 보실 수 있습니다. 

 

이러한 간단한 예시로도 성능차이를 볼 수 있습니다.

 

 

 

 

 


사용법을 알아보겠습니다.

다음은 위의 예제를 주석을 통해 사용법을 설명드리겠습니다.

public class Main {

	private static Scanner sc = new Scanner(System.in);
	
    /* 예외처리는 필수입니다. 가독성을 위해 try문을 사용하지 않았습니다. */
	public static void main(String[] args) throws NumberFormatException, IOException {
 		
        
        /* BufferedReader,writer을 import받습니다. */
        //다양한 방법이 있지만, 콘솔로 입출력을 하기위해 Stream도 import해서 사용합니다. 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
        
        /* br객체를 이용해 입력한 값을 읽어오는 readLine()메소드는 문자형으로 읽어옵니다.
        그래서 숫자형으로 형변환을 해줬습니다. */
		int N = Integer.parseInt(br.readLine());
		
        
        /* 기본적으로 개행이 되지 않기 때문에 개행을 해주어야 합니다. */
		for (int i = 1; i <= N; i++) {
			bw.write(i+"\n");
		}
		
        
        /* 스트림의 값을 출력해줍니다. 
        정확히 말하면 버퍼를 비워준다, 보내준다가 맞을 것 같습니다. */
		bw.flush();
        
        
        /* bw 객체를 닫아줍니다. 사실 close()함수가 닫기 전 자동으로 flush를 호출합니다. */
		bw.close();
		
	}
}

잘못된 부분은 알려주시면 수정하도록 하겠습니다. 감사합니다.

'Dev > Java & Spring' 카테고리의 다른 글

[SpringBoot] DB 연결  (0) 2020.03.06
[Spring] AOP 개념  (0) 2020.03.03
[Spring] Maven Ojdbc6 에러  (0) 2020.02.21
[JSP]  HttpSession 인터페이스  (0) 2020.02.13
[Java] ArrayList  (0) 2020.02.06