본문 바로가기
자바

BufferedWriter를 Integer와 쓸 때 유의점

by N.Damgom 2021. 9. 29.

알고리즘을 풀다가 자꾸 틀렸다. 분명 쉬운 문제인데? 찬찬히 읽어보니 로직은 문제가 없었다.

콘솔에서 돌려보니 범인은 BufferedWriter

 

정수가 나와야하는데 공백이 나온다. BufferedWriter 는 OutputStreamWriter를 데코레이터 패턴으로 조합해 사용한다. java.io에서 Reader/Writer는 문자열을 받아서 character 배열로 쪼갠 다음 byte로 인코딩해서 Stream으로 전달하는 책임을 가지는 객체이다. 따라서 숫자 역시  문자열로 취급되어 각 문자로 쪼개져 인코딩이 되는 줄 알았다. OutputStreamWriter를 보면 입력으로 들어온 문자열을 문자(CharBuffer)로 쪼개서 바이트로 인코딩하는 부분이 있다.

하지만 웬걸, Integer 들어오면 그대로 아스키 코드표에 의해 char로 변환해서 write로 던지고 write는 character 배열을 CharBuffer로 감싸서 바이트로 인코딩한다. 그래서 13같은 숫자는 아스키 코드표를 보면 실제로 출력되는 문자가 아니기 때문에 공백이 출력된 것. 내 예상은 13은 "13"으로, "13"은 '1' 과 '3'으로 쪼개져서 버퍼에 담길 줄 알았는데 정 반대였다.

 

 

알고리즘 풀이여서 다행이지, 실제 프로젝트였다면, 특히 테스트코드가 부실했다면 장애가 날 수도 있겠다는 생각이 든다.

 

큰 프로젝트일수록 간단한 코드를 짜더라도 API 문서와 실제 구현을 꼼꼼히 봐야겠다.