엔지니어로 가는 길

Java PrintWriter의 println 메소드가 생각대로 작동하지 않는다 본문

프로그래밍/Java

Java PrintWriter의 println 메소드가 생각대로 작동하지 않는다

탐p슨 2020. 1. 20. 17:11
728x90

TCP 방식으로 데이터를 주고받게 하기 위해 아래와 같이 Server 클래스와 Client 클래스를 만들었다.

 

Server class

ServerSocekt

Socket

BufferedReader

PrintWriter

 

Client class

Socket

BufferedReader

PrintWriter

 

한 쪽에서 다른 한 쪽으로 PrintWriter의 println 메소드를 통해 문자열을 보냈는데 이상하게 제대로 전달이 이루어지지 않았다. 문제는 둘 중 하나다. PrintWriter의 println에 문제가 있거나, BufferedReader의 readLine에 문제가 있거나.

 

PrintWirter의 println을 무한반복으로 시도해보았는데 이때는 정상적으로 전달받았다. 따라서 BufferedReader의 readLine은 문제없이 얌전히 입력이 오기를 기다리고 있고, 문제는 PrintWriter의 println에 있다고 가정했다.


printWriter = new PrintWriter(socket.getOutputStream());

 

나는 PrintWriter 객체를 생성할 때 위와 같이 하나의 인자만을 넣어준 뒤 생성했는데, 어떤 예제를 보니 두 번째 인자로 true를 주었다. 그래서 두 번째 인자로 true를 주자 무한반복하지 않고 한 번만 println하더라도 제대로 데이터가 전달되었다. 두 번째 인자는 무엇일까.

 

 

https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html

 

PrintWriter의 두 번째 인자는 autoFlush라는 이름의 boolean 타입이다. 뭔지 알 것 같다. 

 

출력은 바로 일어나지 않고 output buffer라는 곳을 거친 뒤에 출력으로 이어진다. output buffer를 두는 이유는 여러가지가 있을 수 있겠지만 아마 1bit가 올때마다 쓰는 것보다 모아두었다가 한 번에 쓰는 게 출력에 따르는 오버헤드의 수가 줄어들기 때문에 그런게 아닐까. 어쩌면 보내려고 하는 정보가 1bit가 아니라 예를 들면 8bit씩 끊어 읽어야만 하는 정보일 때 받는 쪽에서 특정 크기로 끊어 받도록 강제하기 위함일지도 모르겠다.

 

아무튼 output buffer는 그 목적상 어느 정도가 되어야 출력을 한다. buffer가 가득차야만 출력을 하는지도 모르겠다. 예를 들어 output buffer가 1byte(8bit)가 되어야 출력을 한다고 가정해보자. 그러면 output buffer에 1bit가 오든, 2bit가 오든, 7bit가 오든 출력이 이루어지지 않는다. 오직 8bit가 될 때만 출력을 한다.

 

내가 PrintWirter의 println으로 어떤 문자열을 보냈을 때 그게 제대로 전달되지 않은 이유는 내가 보낸 문자열의 크기가 output buffer가 만족할 만큼 충분히 크지 않았기 때문인 것 같다. autoFlush는 이런 상황을 해결하기 위해 존재하는 것으로, autoFlush가 true일 경우 output buffe가 어느 정도로 차야만 비워내는 게 아니라 println이 불릴 때마다(또는 newline character나 '\n'가 쓰일 때마다) 비워내도록 설정되는 것 같다.

728x90
Comments