pooney
Published 2020. 6. 21. 20:41
Java 출력스트림 Java

우리는 java 프로그래밍을 하면서 출력을 하고자 할때 write() , prinit() ,println() 등을 많이 봐왔을것입니다. 이것들은 모두 출력을 위한 메소드들입니다. 이러한 메소드들은 하나의 객체에 묶여 있습니다. 그 객체는 아래와 같은 System.out의 out 입니다. out은 우리는 Stream 객체라고 부릅니다. 

 

System.out.println("출력");
System.out.write(77);

 

 

우리가 만든 프로그래램이 콘솔, 모니터에 출력하고자 할때 write() 함수를 호출하여 출력을 합니다. 그러면 1번 모니터에 출력이되고 다시 한번 호출하면 다시한번 모니터에 출력되어 2번 출력이 될 것입니다. 하지만 우리의 환경은 하나의 프로그램만 돌아가는 것이 아닌 대부분 여러프로그램이 동시에 돌아가는 환경입니다. 하나의 프로그램이 출력을 하고자 모니터에 데이터를 보내는데 동시에 여러 프로그램도 출력을 하고자 모니터에 보내는 현상이 발생 할 수 있습니다. 그러다 보면 장치(출력장치) 하나를 두고 여러 프로그램이 싸우는 현상이 발생할 것입니다. 그러면 이러한 현상을 해결 할 수 있는 방법은 하나의 프로그램이 차례로 사용하는 것입니다. 이렇게 차례로 사용하는 것을  동기화라고 합니다. 예로 대학교 교수님에게 한명씩 출석체크를 하는 것이 라고 생각 하시면 됩니다. 그러면 발생하는 문제가 출석체크를 하기위하여 기다리는 동안에는 교수님에게 출석체크를 하는중인 사람은 문제가 없지만 기다리는 사람은 그동안 해야 할 일을 하지 못하는 문제가 발생합니다. 이러한 문제를 해결하기 위하여 출력버퍼라는 것을 사용하게 됩니다. 즉 출석체크를 할 수 있는 리스트를 만들고 거기다가 적고 가는 겁니다. 그러면 교수님은 여유가 되면 리스트를 보고 출석체크를 진행 할 것이고 우리는 출석체크에 이름만 적고 가면 됩니다. 즉 출석체크 리스트를 출력버퍼라고 하고 이러한 방법을 비동기화 라고 합니다.  그러면 이러한 출력버퍼를 관리하고 각 프로그램 순서에 맞게 출력을 하라고 지시 할 수 있는 것이 필요할 것입니다 . 이것은 원래는 OS가 담당하지만 Java는 자바의 실행플랫폼이 존재하여 모니터에 출력을 할 수 있습니다.  이러한 출력버퍼는 java에서는 OutputStream라고 부릅니다.  OutputStream은 출력에대한 Stream 즉 버퍼라고 말 할 수 있습니다. Stream이 가지고 있는 의미는 단뱡향 버퍼로 사용에 따라 입력 스트림, 출력 스트림으로 바뀔수 있습니다.  

즉 각 프로그램은 출력하고자 하는 데이터 모니터에 직접 전달하는 것이아닌 출력 버퍼에 담고 이 출력버퍼는 모니터가 읽을 수 있을때 가져다 읽는다 라고 정리 할 수 있습니다. 주의 할점은 OutputStream은 객체가 아닌 개체이며 OutputStream의 객체는 out입니다. 때문에 out이라는 객체를 이용하여 출력을 하게 됩니다.

 

우리는 out이라는 객체를 만든적이 없습니다. 흔히 객체를 만들때는 new 연산자를 통해 객체를 생성하고 이름을 부여하여 참조변수에 담아 내지만 out은 우리가 부여한것이 아니고 자바플랫폼에서 부여한 것입니다. 그 이유는 콘솔 입출력은 가장 기본이 되는 것이기 때문에 자바플랫폼에서 미리 만들어 낸것입니다.  때문에 우리는 입력 스트림 , 출력 스트림은 우리가 만들필요가 없습니다.  그럼으로 우리는 out.write(77) 이라는 함수를 통해 출력을 할수가 있게 된것입니다. out.write(77)의 뜻은 77을 write해라 어디에? out에 라는 뜻으로 해석 할 수 있습니다. 그리고 out.flush()라는 함수를 통해 버퍼에 있는 것을 실제 모니터 , 콘솔에 출력을 하게 되는 동작을 수행합니다. 

 

우리는 System.out.wrtie(77) 을 사용하면 콘솔창에  77이 출력되는 것이 아닌 아무것도 안찍히거나 이상한 값이 출력될것입니다. 그이유는 77이라는 값은 키보드에 라벨링 되어있는 값이기 때문입니다. 77이라는 숫자는 아스키코드표에 의해서 특정값으로 변경이 되어 출력이 됩니다. 떄문에 77이 아닌 M이 출력될 것입니다. 하지만 실행 시킨결과 아무값도 콘솔창에 찍히지 않습니다. 그이유는 77의 키코드값은 출력버퍼인 out에 담겨져만 있기때문입니다. 실제로 콘솔창에 출력되기 위해서는 버퍼가 다 차거나 , flush라는 함수를 통해 출력할 수가 있습니다. 

'Java' 카테고리의 다른 글

Java 인스턴스 변수와 정척 초기화 블록  (0) 2020.08.17
Java Enum 이란?  (0) 2020.06.28
Java 날짜 연산 LocalDateTime  (0) 2020.06.28
Java 동적으로 객체 생성하기  (0) 2020.06.21
profile

pooney

@pooney

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!