JAVA/JAVA Basic

[ JAVA ] 기반 스트림, 보조 스트림

IT록흐 2021. 7. 12. 20:47
반응형

 

 

[ JAVA ] 스트림이란? ( 바이트 기반 스트림 , 문자 기반 스트림 )

스트림(Stream)에 대해서 파헤쳐보자. [ JAVA ] 문자 인코딩(Character Encoding)이란? 인간과 컴퓨터가 대화하려면 어떻게 할까? 인간의 언어는 문자, 이미지, 동영상, 소리 등이 있다. 그러나 컴퓨터는 1

lordofkangs.tistory.com

 

 

지난 포스팅에서 

스트림(Stream)에 대해서 알아보았다.

 

간단히 정리하면

 

데이터는 스트림의 형태로 전송된다. 스트림(Stream)이란, 바이트의 흐름을 의미한다. 프로그램은 외부의 데이터를 스트림의 형태로 입출력한다. 이때, 1byte는 아스키코드 문자와 이미지, 영상 데이터의 기본 단위가 된다. 그러므로 1byte 단위로 스트림을 읽을 필요가 있는데, 이때 사용되는 객체를 '바이트 스트림'이라 부른다.

 

그러나 유니코드 문자의 경우, 인코딩 방식에 따라, 한 문자를 표현하는데 필요한 바이트가 다르다. JAVA의 경우, 프로그램 안에서 문자를 메모리에 저장할 때 UTF-16 인코딩 방식을 사용한다. UTF-16 인코딩 방식은 2byte(char형)로 문자를 저장한다. 그러므로 다른 방식으로 인코딩 된 유니코드 문자 데이터의 스트림이 프로그램에 입력되면 해당 문자를 UTF-16 방식으로 전환하는 과정이 필요하다. 이런 과정을 담당하는 객체를 문자 스트림이라고 한다.

 

 

InputStream, OutputStream vs Reader, Writer 

 

 

이렇듯, JAVA에서 사용되는 스트림 객체는

크게 바이트 스트림과 문자 스트림으로 나뉜다.

 

접미사로 InputStream, OutputStream을 썼으면 바이트 스트림이고

접미사로 Reader, Writer를 썼으면 문자 스트림이다.

 

InputStream 클래스의 자식클래스
Reader 클래스의 자식 클래스

 

 

기반 스트림 , 보조 스트림

 

이렇게 다양한 스트림이 있지만

각각 역할이 다르다.

 

역할은 특징에 따라 

크게 3가지로 나뉜다.

기반 스트림, 보조 스트림, 메모리 스트림

 

기반 스트림과 보조스트림을 알아보자

 

 

- 기반스트림

 

기반 스트림은 프로그램 밖에서 실제로 스트림을 받아오는 객체이다.

 

키보드에서 입력받은 데이터이든 HDD에 저장된 파일이든 소켓통신으로 전송된 데이터이든 프로그램 밖에서 입력되는 데이터는 기반 스트림에 의해 프로그램 안으로 들어온다.

 

FileInputStream, FileOutputStream

파일에 저장된 데이터를 스트림 형태로 입력받고 출력하는 Stream 객체이다. 

 

System.in, System.out

대표적으로 키보드에서 입력받은 데이터를 프로그램 안으로 저장하거나 모니터로 출력하는 Stream 객체이다. 입력받은 데이터는 바이트 데이터로 숫자, 문자, 문자열같은 형태로 가공하는 과정이 필요하다. Scanner 클래스는 이 과정을 편리하게 해준다. 관련해서는 다음에 자세히 다루어 보겠다.

 

- 보조스트림

보조 스트림은 기반스트림이 읽어온 데이터를 활용한다.

 

BufferedInputStream, BufferedOutputStream

 

BufferedInputStream과 BufferedOutputStream을 사용하는 이유는 '입출력 속도 향상' 때문이다.

 

BufferedInputStream 클래스의 생성자

 

보조 스트림은 이렇듯, 기반 스트림을 생성자의 매개변수로 갖는다. BufferedInputStream 객체는 기반 스트림이 읽어온 스트림 데이터를 내부버퍼에 저장한다.

 

BufferedInputStream 클래스의 내부버퍼

 

 

BufferedInputStream 객체는 필드로 바이트 배열을 갖는데, 이가 내부버퍼이다. BufferedInputStream 객체는 read() 메소드로 내부버퍼에 저장된 스트림데이터를 읽으면, 자동으로 내부버퍼는 다음 스트림 데이터로 채워진다.

 

 

 

BufferedInputStream 객체가 없다면 기반스트림 객체를 통해 입력버퍼에서 데이터를 받아야 한다. 그러나 프로그램 입출력 속도와 입력버퍼의 입출력 속도는 서로 다르다. 그러므로 둘 사이에 완충지대로 내부버퍼를 놓는다면 입출력에 지연이 생겨도 내부버퍼 안에 데이터가 미리 대기하고 있므로 지연 발생없이 속도는 향상된다.

 

ObjectInputStream, ObjectOutputStream

 

컴퓨터는 1과 0 밖에 모른다. 그러므로 인간이 사용하는 문자, 소리, 이미지, 영상은 스트림 형태로 '인코딩'된다. 이렇듯 데이터는 인코딩되어 스트림으로 바뀐다. 그러나 인간이 사용하는 데이터가 하나 더 있다. 바로 객체이다. 객체는 인간이 이해할 수 있도록 구조화 한 데이터이다. 객체 데이터를 전송하려면 1과 0의 스트림으로 바꾸어야 한다. 이 작업을 두고 직렬화(Serializable)라고 부른다. 기반스트림으로부터 직렬화된 스트림 데이터가 들어오면 이를 객체로 바꾸어주는 객체가 바로 ObjectInputStream이다. ObjectOutputStream은 그 반대의 역할을 한다. 직렬화와 관련된 내용은 나중에 포스팅에서 다루어 보겠다.

 

 

 


 

 

이렇게 바이트 스트림 위주로

기반스트림과 보조스트림을 알아보았다.

 

문자 스트림의

기반스트림과 보조스트림을 이해하려면

InputStreamReader 클래스의 개념을 이해야한다.

 

이는 다음 포스팅에서 정리하겠다.

 

반응형