이전글


입출력 패키지(java.io)
자바에서 입출력과 관련된 클래스들은 java.io 패키지에 모아두었기 때문에 입출력 프로그램을 작성하기 전에는 java.io 패키지를 import 시켜주어야 합니다.
import java.io.*;
cs



입출력 단위와 대상에 따른 클래스 분류
java.io 패키지 안에는 사용 목적, 동작 방식에 따라 개발자가 원하는 입출력을 수행할 수 있도록 하기 위해 수많은 입출력 관련 클래스들을 모아 두었습니다. 따라서 이를 구분하기 쉽도록 클래스명(식별자)이 명명되었는데, 클래스명의 앞 뒤에 붙는 접두사와 접미사를 보면 그 입출력 클래스의 특성을 이해할 수 있습니다.

가장 기본적으로 입출력 단위(크기) 에 따라 분류할 수 있습니다. 바이트(byte) 단위 입출력 스트림과 문자(char) 단위 입출력 스트림으로 분류될 수 있는데, 바이트 단위 입출력 클래스에는 InputStream, OutputStream이 있고 각각 바이트 단위 입력, 바이트단위 출력을 의미합니다. 또한 문자 단위 입출력 클래스에는 Reader, Writer가 있고 각각 문자단위 입력과 출력을 의미합니다.


클래스명의 접미사에 따른 분류 기준
접미사
입출력 단위
역할
InputStream
바이트(byte) 단위
데이터 입력
OutputStream
바이트(byte) 단위
데이터 출력
Reader
문자 단위(2byte)
데이터 입력
Writer
문자 단위(2byte)
데이터 출력


굳이 입출력 단위별로 클래스를 분류해놓은 이유는 자바의 언어적 특성 때문인데, 자바 이전에 등장한 C언어의 경우에는 문자가 ASCII 코드를 사용하기때문에 1byte 단위인데에 비해 자바 언어는 문자(char)가 2byte를 사용하기 때문에 문자 단위 입출력에 바이트 단위 입출력을 사용하기에 번거로웠기 때문입니다.

따라서 클래스명의 접미사에 InputStream 또는 OutputStream이 붙으면 바이트단위 입출력 클래스 라는것을 알 수 있고, Reader, Writer가 붙으면 문자단위 입출력 클래스라는 것을 알 수 있습니다. 여기서 입출력 대상이나 용도에 따라서 접두사가 달라지는데 예를 들어 파일 관련 입출력 클래스로는 FileInputStream, FileOutputStream,  FileReader, FileWriter가 있고 접두사만으로 '파일관련 입출력 클래스' 라는 사실과 각각 '바이트 단위' 혹은 '문자 단위'로 입출력하는 클래스구나 라는 사실을 알 수 있는 것입니다.

다음은 여러가지 접두사별 입출력대상 중 일부를 나타낸 표입니다.

클래스명의 접두사에 따른 입출력 대상
접두사
입출력 클래스
입출력 대상

File
FileInputStream, 
FileOutputStream, 
FileReader, 
FileWriter

파일

Byte
ByteInputStream, 
ByteOutputStream, 
ByteReader, 
ByteWriter

메모리(byte 배열)

Piped
PipedInputStream, 
PipedOutputStream, 
PipedReader, 
PipedWriter

특정 프로세스

Audio
AudioInputStream, 
AudioOutputStream, 
AudioReader, 
AudioWriter

오디오 Device


 

 

 



보조 스트림
입출력 단위와 대상에 따른 분류에 대해 알아보았는데, 입출력 패키지에서 클래스를 분류하는 기준이 한가지 더 있습니다. 

바로 보조 스트림인데, 보조 스트림이란 실제 입출력을 수행하지는 못하지만 실제 입출력을 수행하는 스트림을 도와주거나 입출력 되는 데이터의 구조를 바꾸어 주는 역할을 하는 스트림 클래스 입니다. 

실생활을 예로 들자면 우리가 사용하는 최근의 스마트폰은 충전시에 USB C Type 규격을 주로 사용합니다. 그러나 우리가 일상에서 사용하는 전기 규격은 220v 돼지코입니다. 따라서 실질적으로 전기를 입력받는 통로(스트림)는 220V 돼지코이지만 USB C Type 으로 변환해주는 보조스트림 역할의 USB C Type 젠더(어댑터) 케이블을 끼워넣는 것입니다.


즉 입력받는 데이터(전기)를 젠더(어댑터) 라는 보조 스트림을 통해 가공하여 입력받는것입니다.

Java에서의 예를 들어보겠습니다. 파일로부터 문자열 데이터를 읽어오고 싶은데, 성능 향상을 위해 버퍼를 사용하고 싶은 경우 다음과 같이 사용할 수 있습니다.
//실질적으로 파일로부터 데이터를 읽어오는(입력) 1차 스트림
FileInputStream fileInputStream = new  FileInputStream("todo_list.txt");
 
//중간에 버퍼기능을 하는 보조스트림 사용
BufferedInputStream bufferedInputStream = new  BufferedInputStream(fileInputStream);
 
//보조 스트림을 통해 입력 수행(내부적으로 그 끝은 FileInputStream이  입력을 수행)
bufferedInputStream.read();
cs





1차 스트림과 보조 스트림 구분 방법
기본적으로 자바 API에서 제공하는 스트림 클래스의 종류만 해도 수십개가 넘는데 어떻게 실제로 데이터 입출력을 수행하는 1차 스트림과 입출력을 수행하지는 않지만 보조적인 기능을 제공하는 보조 스티림을 구분할 수 있을까요?

가장 간단한 방법으로는 FilterInputStream을 상속받거나 InputStream 타입의 객체를 매개변수로 받는 생성자를 갖는다면 그것은 보조 스트림이라고 할 수 있습니다. 보조 스트림은 직접적으로 입출력을 수행할 수 없기 때문에 1차 스트림을 필요로 하기 때문입니다.


블로그 이미지

도로락

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

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