I/O(Input/Output, 입출력)
I/O는 Input/Output의 약자로 즉 입출력을 의미하며, 소프트웨어 측면에서의 데이터를 입력(입력받음)하거나 출력(외부로 출력함)하는 것을 의미합니다. 헷갈릴 수 있겠지만 내 자신(내가 개발하는 어플리케이션)을 기준으로 입력이라 함은 외부로부터 데이터를입력 받는 것을 의미하며, 출력이라 함은 내 자신이 어플리케이션 이외의 외부 특정 대상에게 데이터를 출력하는 것을 의미합니다.

가장 간단한 예로 System.in 객체는 표준 입력을 다룰 수 있는 객체로 키보드로부터 입력을 담당하는 객체이고 System.out 객체는 표준 출력을 다룰 수 있는 객체로 콘솔로 데이터를 출력할 수 있는 기능을 가지고 있습니다. 자바를 배울때 가장 처음 배우게 되는 Hello World 출력 프로그램에서 System.out.println() 메서드를 사용하는데 System.out 이라는 표준 출력(콘솔출력) 객체의 println() 메서드를 사용하게 되는 것입니다.

입출력은 하나의 컴퓨터 안에서 일어나기도 하지만 연결되어있는 작은 네트워크상의 다른 컴퓨터나 크게는 인터넷 안에 있는 서버와도 이루어질 수 있습니다. 예를 들어 웹서버에 접속하여 파일을 업로드하고 다운로드 하는 것도 입출력의 예 라고 볼 수 있겠습니다.




스트림(Stream)이란?
자바에서는 스트림을 통해 입출력을 하게 됩니다. 스트림의 원래 뜻은 물줄기, 흐르는 물, 시내(시냇물) 등의 뜻을 가지고 있습니다. 그러나 여기서 스트림의 의미는 데이터가 줄지어서 흐르며 흐르는 통로 정도의 의미를 가질 수 있겠습니다. 우리가 일상에서 특정 은원 사이트에서 음원 스트리밍(Streaming) 서비스(노래를 실시간으로 다운로드 받으면서 듣는 것)를 이용하는데, 여기서 사용하는 스트림과 같은 의미를 갖는다고 생각하면 이해하기 쉬울 것입니다.




입력 스트림 출력 스트림(Input Stream, Output Stream)
스트림은 데이터를 주고 받기 위한 통로라고 설명했는데, 얼핏 생각하기에는 하나의 통로만 있으면 입출력을 모두 수행할 수 있다고 생각할 수 있지만 입출력을 모두 수행하는 프로그램을 만들기 위해서는 입력스트림과 출력스트림이 각각 하나씩 따로 필요합니다.


처음에도 설명했지만 내 자신(프로그램)을 기준으로 특정 대상에게 데이터를 출력을 하는 방향이 출력 스트림이며, 반대로 상대방으로부터 데이터를 입력받는 방향이 입력 스트림 입니다. 상대방 입장에서는 나의 출력 스트림으로 부터 전송된 데이터를 상대방의 입력 스트림을 통해서 받아야 할 것입니다. 처음에는 이러한 부분이 매우 헷갈릴 수 있으니, 정말 단순하게 입력(받는다) 출력(상대방에게) 으로 알아두는 것이 편합니다.




스트림은 큐(Queue)와 같다
스트림은 데이터를 일렬로 linear 하게 전송하게 되는데, 스트림은 1차선 일방통행 도로와 같아서 입출력을 동시에 처리할 수 없고, 먼저 내보낸 데이터를 상대방입장에서는 먼저 받게 되는 First In First Out(FIFO) 구조를 갖습니다. linear 하기 때문에 첫번째 데이터를 받고 두번째 데이터를 건너뛰어 세번째 데이터를 먼저 받는다든가 하는식의 입출력은 불가능합니다.


예를 들어 JAVA 라는 String 데이터를 상대방에게 출력하려면 당연히 J 를 먼저 스트림을 통해 보내야 상대방 입장에서는 JAVA 라는 문자열 그대로 받을 수 있을것입니다. 따라서 데이터 입출력 도중에 어떤 문제로 인해 스트림이 끊어지게 되면 먼저 받던 데이터만 받을 수 있습니다.


다음글
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!