문제

package baekjoon;

import java.io.*;

public class Buffer {
    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 inputCnt = br.readLine();
        int cnt = Integer.parseInt(inputCnt);
        
        while(cnt!=0){
            String inputNums = br.readLine();
            String[] stringNums = inputNums.split(" ");

            int sum = 0;
            for(String i : stringNums){
                sum += Integer.parseInt(i);
            }
            bw.write(sum);
            bw.newLine();
            cnt--;
        }
        bw.flush();
        bw.close();
    }
}

 

코드를 위와 같이 작성했을 때, 입력만 받고 출력없이 프로그램이 종료되는 문제가 발생했다.

 


원인

 

디버깅 했을 때, 출력할 변수인 sum에도 값이 잘 들어가 있는 걸 볼 수 있는데 출력이 되지 않은 걸 보니, bw.write(sum), bw.flush() 부분 때문인 것 같다.

어딘가에 실수가 있다기 보다는 내가 BufferedWriter를 이해하고 있지 않은 상태에서 작성한 코드라 조금 더 BufferedWriter에 대해 찾아보면 해결 가능할 것 같았다.

 


분석

찾아보니 BufferedWriter는 정수를 매개변수로 전달받지만 내부적으로는 값을 아스키코드로 변환해서 문자열로 다루는 함수였다.

따라서 전달한 값을 의도대로 출력하기 위해서는 valueOf로 문자열로 변환한 후에 출력하거나, 개행문자를 추가해주면 됐다.


아스키코드로 변환해서 출력하는 시스템인데, 왜 나는 아무것도 출력이 되지 않았을까해서 아스키코드를 살펴봤다.

피연산자를 1, 2, 3 같이 작은 숫자로만 지정하고 테스트를 했다보니 해당하는 아스키코드 값이 SOH, STX 등의 제어 문자였다.

아래와 같이 피연산자의 값을 크게 지정하고 실행하니 아스키코드 'A'가 출력되는 걸 볼 수 있었다.

 


 

해결

 

첨부된 이미지처럼 write 메서드 안에 문자열을 추가해주니 결과값이 제대로 출력되는 것을 볼 수 있었다.