[스터디]Java의 정석 29일차

Kristopher·2022년 2월 2일
0

Java 스터디

목록 보기
29/31

(Ch 15) 1. 자바에서의 입출력 ~

5. 문자기반의 보조 스트림

입/출력을 위한 스트림이란?

입출력이란 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다. 자바에서 입출력을 실행하기 위해서 두 대상을 연결하고 데이터를 전송하는 역할로 스트림을 사용한다. 즉 스트림이란 데이터를 운반하는데 사용되는 연결통로이다. 하나의 스트림은 단방향 연결만 가능하기에 입력과 출력을 동시에 수행하기 위해서는 2개의 스트림이 필요하다.

바이트 기반 스트림이란?

스트림은 바이트단위로 데이터를 전송하며 입출력에 대상에 따른 스트림이 존재한다.

File 스트림 : 파일 대상
ByteArray 스트림 : 메모리 대상
Piped 스트림 : 프로세스 대상(프로세스간 통신)
Audio 스트림 : 오디오 장치 대상

각각의 입/출력 스트림은 모두 InputStream, OutputStream의 자손들이며, 각각의 데이터를 읽고 쓰는데 필요한 추상메서드를 자신에 맞게 구현해 놓았다.

//InputStream의 메서드
abstract int read()
int read(byte[] b)
int read(byte[] b, int off, int len)
//OutputStream의 메서드
abstract void write(int b)
void write(byte[] b)
void write(byte[] b, int off, int len)

read()와 write(int b)를 제외한 메서드들은 추상메서드가 아니기에 구현하지 않아도 된다고 볼 수 있지만, 메서드 내부에서 추상메서드를 호출하고 있기에 모든 메서드를 구현해야 한다.

보조스트림이란?

스트림의 기능을 보완하기 위한 보조스트림이 존재한다. 보조스트림은 실제 데이터를 주고 받는 스트림은 아니지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다. 스트림을 생성한 이후 이를 활용하여 보조스트림을 생성해야 한다.

FileInputStream fis = new FileInputStream("test.txt"); // 스트림 생성
BufferedInputStream bis = new BufferedInputStream(fis); // 보조스트림 생성
bis.read();

문자기반 스트림이란?

지금까지 본 스트림은 모두 바이트기반의 스트림이다. C언어와 달리 Java에서는 한 문자를 의미하는 char형이 2byte이기 때문에 바이트기반 스트림으로 문자를 처리하는데 어려움이 있다. 이 점을 보완하기 위해 문자기반 스트림이 존재한다.

  • InputStream -> Reader
  • OuputStream -> Writer

위와 같이 바이트기반 스트림 이름에서 문자기반 스트림으로만 변경해주면 된다.

바이트기반 스트림의 종류

ByteArrayInputStream과 ByteArrayOutputStream

ByteArrayInputStream / ByteArrayOutputStream은 바이트배열에 데이터를 입출력 하는데 사용되는 스트림이다. 주로 다른 곳에서 입출력하기 전에 데이터를 임시로 바이트배열에 담아 변환할 때 사용한다.

FileInputStream과 FileOutputStream

FileInputStream / FileOutputStream은 파일을 입출력하기 위한 스트림으로, 실제 프로그래밍에서 많이 사용된다.

바이트기반의 보조 스트림 종류

FilterInputStream과 FilterOutputStream

FilterInputStream / FilterOutputStream은 모든 보조스트림의 조상이다. FilterInputStream / FilterOutputStream 자체로는 아무런 일도 하지 않기 때문에 상속을 통해 원하는 작업을 수행하도록 읽고 쓰는 메서드를 오버라이딩 해야한다.

BufferedInputStream과 BufferedOutputStream

BufferedInputStream / BufferedOutputStream은 입출력의 효율을 높이기 위해 사용하는 보조스트림이다. 한 바이트씩 입출력하는 것보다는 버퍼(바이트배열)를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르기 때문에 대부분의 입출력 작업에서 사용된다. 버퍼의 크기는 입력소스로부터 한 번에 가져올 수 있는 데이터의 크기로 지정하는 것이 바람직하며, 일반적으로 8192(8K) 정도의 크기로 지정한다.

DataInputStream과 DataOutputStream

DataInputStream / DataOutputStream은 byte단위가 아닌 8가지 기본 자료형의 단위를 읽고 쓸 수 있다는 장점이 있다. DataOutputStream이 출력하는 형식은 각 기본 자료형 값을 16진수로 표현하여 저장한다.

SequenceInputStream

SequenceInputStream은 여러 개의 입력스트림을 연속적으로 연결해서 하나의 스트림으로부터 데이터를 읽는 것과 같이 처리할 수 있도록 도와준다. 생성자만 다른 스트림과 다를 뿐 나머지 부분은 비슷하다. 큰 파일을 여러 개의 작은 파일로 나누었다가 하나의 파일로 합치는 것과 같은 작업을 수행할 때 사용하면 좋다.

PrintStream

PrintStream은 데이터를 기반스트림에 다양한 형태로 출력할 수 있는 print, println, printf와 같은 메서드를 오버로딩하여 제공한다. 적절한 문자로 출력하기 때문에 문자기반 스트림의 역할을 수행한다. PrintStream과 유사하게 PrintWriter가 존재하는데 JDK1.1부터 적용되었으며 PrintStream보다 향상도니 기능을 가지고 있다. PrintWriter는 다양한 언어의 문자를 처리하는데 적합하다.

문자기반 스트림의 종류

Reader와 Writer

Reader / Writer는 문자기반 스트림의 조상이라고 볼 수 있다. byte배열 대신 char배열을 사용한다는 점을 제외하고 InputStream/OutputStream의 메서드와 동일한 메서드를 갖는다.

FileReader와 FileWriter

FileReader / FileWriter는 파일로부터 텍스트데이터를 읽고, 파일에 쓰는데 사용된다.

PipedReader와 PipedWriter

PipedReader / PipedWriter는 쓰레드간 데이터를 주고받을 때 사용한다. 다른 스트림과 달리 입력과 출력스트림을 하나의 스트림으로 연결해서 데이터를 주고받는다는 특징이 있다.

StringReader와 StringWriter

StringReader / StringWriter는 입출력 대상이 메모리인 스트림이다. StringWriter에 의해 출력된 데이터는 내부의 StringBuffer에 저장되며 StringWriter의 메서드를 이용해 저장된 데이터를 얻을 수 있다.

문자기반의 보조스트림

BufferedReader와 BufferedWriter

BufferedReader / BufferedWriter는 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할을 한다. BufferedReader의 readLine()을 사용하여 데이터를 라인 단위로 읽을 수 있다.

InputStreamReader와 OutputStreamWriter

InputStreamReader / OutputStreamWriter는 바이트기반 스트림을 문자기반 스트림으로 연결시켜주는 역할을 한다. 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행한다.

Reference

Java의 정석
남궁성의 정석코딩

profile
개발자 지망생입니다.

0개의 댓글