본문 바로가기

Algorithm/Algorithm for Beginner

2. BufferedWriter와 System.out.println() 의 비교와 사용법

잘 구현된 알고리즘은 속도면에서 그리고 메모리면에서 최적화되어 있어야 합니다. 만일 문제는 잘 풀어놓고도 많은 입력과 출력을 감당하지 못해서 실행 속도가 느려진다면 복장이 터질겁니다. 그렇다면 어떤 문제들을 풀 때 입출력에 유의해야 할까요. 가장 손쉽게 파악할 수 있는 방법은 문제에서 주어진 입력, 출력 예시를 보는 것입니다. 문제에서 가능한 케이스가 무엇인지 모두 출력하게 한다던가, 여러 케이스의 답을 한번에 출력하기를 바란다면 말은 하지 않았지만 빠른 입출력을 사용하는 것을 은연중에 의도한 것이라고 할 수 있습니다. 어쩌면 의도하는게 아니라 빠른 입출력의 사용을 지극히 당연하게 생각하고 있을 수도 있겠습니다. 


프로그래밍을 처음 시작할 때 일반적으로 우리는 출력을 먼저 하게 됩니다. Java 개발을 처음 시작하셨을 때를 떠올려본다면, 어느 교재로 공부하셨든 가장 앞에 나오는 것은 바로 "Hello World!" 출력입니다. class가 무엇인지, main 함수가 무엇인지도 모르지만 일단 System.out.println("Hello World!"); 를 이용해서 Hello World가 출력되는지 해보셨을 것입니다. System.out.println은 Java 개발에서 가장 기본이 되는 함수이며 쓰기 편리하고 구현도 간단합니다. 하지만 System.out.println 방식의 출력은 시스템 리소스를 필요 이상으로 잡아먹는다는 한계가 존재합니다. 시간과 리소스를 고려한다는 측면에서 우리는 빠른 입출력 방식인 BufferedWriter를 사용할 수 있습니다.


System.out.println에 대해서는 동고님이 잘 정리해두신 내용이 있어 link 남겨드립니다. 참고하세요.

http://donggov.tistory.com/53


BufferedWriter 구현은 하단의 소스를 참고하시기 바랍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
 
public class BufferedWriterTest {
    // BufferedWriter 역시 BufferedReader와 마찬가지로 IOException 처리를 별도로 해줘야 합니다.
    // 저는 보통 Exception으로 throws시키곤 합니다.
    // try ~ catch가 더 편리하시면 try ~ catch로 처리하셔도 상관없습니다.
    public static void main(String[] args) throws Exception {
        // BufferedReader는 입력값을 바이트스트림에서 문자스트림으로 변환해주는 InputStreamReader와
        // 입력장치를 통해 값을 입력받아주는 System.in을 사용했다고 한다면
        // BufferedWriter는 출력이므로 그에 반대로 작동하는 OutputStreamWriter와
        // System.out을 사용하게 됩니다.
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        // BufferedWriter 객체를 이용하여 출력합니다.
        bw.write("Hello World!");
 
        // write한다고 해서 바로바로 출력되지 않습니다.
        // 직접 출력 stream에 반영되는 것이 아니라 성능을 위해 buffer에 저장해두었다가
        // BufferedWriter가 flush되거나 close되었을 때 한번에 출력 stream에 반영하기 때문입니다.
        bw.flush();
 
        // close는 stream을 닫아버리기 때문에 계속 출력하고자 한다면 flush 사용합니다.
        // bw.close();
 
        // 출력내용에 줄바꿈이 필요하다면 newLine 함수를 사용합니다.
        bw.newLine();
        // 혹은 \n을 출력값의 앞이나 뒤에 넣어줍니다.
        bw.write("new line\n");
        bw.write("new line2");
        bw.close();
    }
}
 
cs