티스토리 뷰

Develop Story/JAVA

<스트림(Stream)>

wisecow 2017. 9. 18. 01:03

# 스트림


 스트림(Stream)이라는 영단어는 흐르는 시냇물을 뜻한다. 종이배를 시냇물에 올려 두면 떠내려가듯, 컴퓨터 공학에서 스트림은 데이터라는 종이배를 띄울 수 있는 시냇물이다. 즉, 데이터의 흐름을 의미한다.


 입력 스트림은 키보드, 마우스, 네트워크 등과 같은 입력 장치로부터 입력된 데이터가 순서대로 프로그램으로 흘러가는 데이터의 흐름 혹은 소프트웨어 장치를 말하고, 출력 스트림프로그램에서 출력된 데이터가 프린터, 콘솔, LCD, 네트워크 등과 같은 출력 장치로 순서대로 전송되도록 보장하는 데이터의 흐름 혹은 소프트웨어 장치를 말한다.


 입력 스트림은 데이터가 입력 장치에서 프로그램으로 들어가는 방향이며, 프로그램에서 출력 장치로 데이터가 이동하는 방향이 출력 스트림의 방향이다. 입력 스트림의 경우 먼저 들어온 데이터가 먼저 프로그램에게 전달되는 FIFO(Frist In First Out) 구조이고, 출력 스트림의 경우 프로그램에서 출력되어진 순서대로 출력된다. 


 /* 프로그램에서 출력된다는 뜻은 데이터의 전송, 흐름을 뜻한다. 예를 들어 사용자가 한글이나 워드 프로그램에서 인쇄를 눌렀다면, 그 데이터가 입력스트림으로 PC 본체에 흘러 들어가고 본체에 들어온 데이터는 다시 출력 스트림을 통해 연결된 프린터기로 가는 구조라고 생각하면 된다. 결국 출력도 데이터의 흐름이라고 생각하면 된다. */


 스트림을 통해 흘러가는 데이터의 기본 단위는 바이트다. 프로그램은 입력 스트림으로부터 받은 바이트들을 문자로 해석하거나, 4바이트씩 끊어 정수(Integer)로 인식하는 등 다양하게 해석할 수 있다. 이는 전적으로 프로그램을 제작하는 프로그래머에게 달려있다.


 컴퓨터의 입출력 시스템은 서로 유기적으로 연결될 수도 있다. 아래의 코드를 예로 살펴보자.


InputStreamReader rd = new InputStreamReader(System.in);


 이 프로그램 코드는 표준 입력 스트림을 발생시키는 장치인 System.in에 의해 리턴되는 스트림 데이터를 문자 스트림으로 변환하는 InputStreamReader에 연결시킨다. InputStreamReader를 통해 데이터를 읽으면 입력된 순서로 문자 값으로 해석하여 읽을 수 있다.


 예를 들어보자. 사용자가 키보드로 'b', '!' 키를 입력하면, 표준 입력 스트림 System.in은 단순히 'b'와 '!'키의 바이트 정보를 보낸다. 바이트 스트림이 InputStreamReader를 통과하면서 InputStreamReader는 이들 바이트 정보를 문자로 인식하여 'b', '!'의 문자로 응용프로그램에게 전달해준다. // 데이터를 문자로서 해석하기 위해 InputStreamReader를 거쳤다고 생각하면 된다. 


 결국 연결된 스트림을 통해 표준 입력 스트림의 데이터가 문자 스트림으로 변환된다. 스트림은 데이터 처리를 위하여 몇 개라도 연결이 가능하다. 아래는 스트림의 몇 가지 특징을 적어 놓았다.

  • 스트림은 지연될 수 있다: 입력 스트림의 데이터가 흘러가는 통로가 비어 있다면, 프로그램은 읽어갈 데이터가 없으므로 스트림에 데이터가 도착할 때까지 기다린다. 반대로 출력 스트림의 데이터가 흐르는 통로에 데이터가 꽉 차 있다면 프로그램은 더 이상 출력할 수 없기에 빈 공간이 생길 때까지 기다린다. 이처럼 입출력 시스템은 지연될 수 있다.

  • 스트림은 바이트 스트림과 문자 스트림으로 나눌 수 있다: 자바에서 스트림의 종류에는 바이트 스트림과 문자 스트림이 있다. 프로그램은 필요에 따라 이들 중 하나를 선택하여 사용하면 된다.

 자바에서는 응용프로그램이 입출력 스트림을 생성하여 입출력을 수행할 수 있도록 입출력 스트림을 위한 클래스를 제공한다. 아래는 텍스트로 이루어진 스트림 클래스 계층 구조이다. // 출처: https://docs.oracle.com/javase/7/docs/api/java/io/package-tree.html

Class Hierarchy


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday