자바 스트림/버퍼/채널
입출력(I/O)
- 입출력은 입력(Input)과 출력(Output)을 합친 말로, 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 의미한다.
스트림(Stream)
- 입출력을 수행한다는 것은 곧 한쪽에서 다른 쪽으로 데이터를 전달하는 것이다.
- 이를 위해선 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데, 이를 스트림(stream)이라고 한다.
- 즉, 스트림이란 데이터를 운반하는 데 사용되는 연결통로이다.
- 스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고받는다. 큐와 같은 FIFO구조로 되어있다고 생각하면 된다.
버퍼(Buffer)
- 데이터를 한쪽에서 다른 한쪽으로 전송하는 동안에 일시적으로 데이터를 보관하는 읽고 쓰기가 가능한 메모리 배열이다.
- 자바 NIO(New Input/Output)에서는 데이터를 입출력하기 위해서 항상 버퍼를 사용한다.
채널(Channel)
- 채널은 기본적으로 스트림과 유사하지만, 단방향 데이터 전송만을 지원하는 스트림과 달리 채널은 양방향 데이터 전송을 지원한다.
InputStream & OutputStream
물이 한방향으로 흐르는 것처럼 스트림도 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다. 그래서 입력과 출력을 동시에 수행하기 위해선 입력을 위한 입력스트림(Input Stream)과 출력을 위한 출력스트림(Output Stream), 모두 2개의 스트림이 필요하다.
자바에서는 java.io 패키지를 통해 InputStream과 OutputStream을 별도로 제공한다. 즉, 자바에서 스트림을 생성한다는 것은 이러한 스트림 클래스 타입의 인스턴스를 생성한다는 의미와 동일하다.
InputStream클래스와 OutputStream클래스에는 각각 read()메소드와 write()메소드가 추상메소드이다. 나머지 메소드들이 내부적으로 이 추상메소드를 사용하기 때문에 반드시 각 추상메소드를 구현해야 한다.
클래스명 | 메소드 | 설명 |
InputStream | abstract int read() | 해당 입력스트림으로부터 다음 바이트를 읽어들임. |
int read (byte[] b) | 해당 입력 스트림으로부터 특정 바이트를 읽어들인 후, 배열 b에 저장함. | |
int read (byte[] b, int off, int len) | 해당 입력 스트림으로부터 len 바이트를 읽어들인 후, 배열 b[off]부터 저장함. | |
OutputStream | abstract void write (int b) | 해당 출력 스트림에 특정 바이트를 저장함 |
void write(byte[] b) | 배열 b의 특정 바이트를 배열 b의 길이만큼 해당 출력 스트림에 저장함. | |
void write(byte[] b, int off, int len) | 배열 b[off]부터 len바이트를 해당 출력 스트림에 저장함 |
Byte Stream & Character Stream
Byte Stream
자바에서 스트림은 기본적으로 바이트 단위로 데이터를 전송한다. 다음과 같은 바이트 기반의 스트림이 존재한다. 여기서 바이트 기반이라함은 입출력의 단위가 1byte인 것을 의미한다.
입력 스트림 | 출력 스트림 | 입출력 대상 |
FileInputStream | FileOutputStream | 파일 |
ByteArrayInputStream | ByteArrayOutputStream | 메모리 |
PipedInputStream | PipedOutputStream | 프로세스 |
AudioInputStream | AudioOutputStream | 오디오 장치 |
Character Stream
C와 달리 자바에서는 char형이 2byte이므로 바이트 기반 스트림으로는 처리가 어려운 경우가 있다. 이를 보완하기 위해 문자 기반의 스트림이 제공된다. 따라서 문자데이터를 입출력할 때는 바이트 기반 스트림 대신 문자 기반 스트림을 사용하면 된다.
이러한 문자 기반의 스트림은 기존의 바이트 기반 스트림에서 InputStream을 Reader로, OutputStream을 Writer로 변경하면 사용할 수 있다. 단, 문자 ByteArrayInputStream에 대응하는 문자 기반 스트림은 char배열을 사용하는 CharArrayReader이다.
입력 스트림 | 출력 스트림 | 입출력 대상 |
FileReader | FileWriter | 파일 |
CharArrayReader | ByteArrayWriter | 메모리 |
PipedReader | PipedWriter | 프로세스 |
AudioReader | AudioWriter | 오디오 장치 |
자바 표준 입출력 클래스
C의 printf()함수나 scanf()함수처럼 자바에서는 System이라는 표준 입출력 클래스를 정의하여 제공하고 있다. 이 또한 java.lang 패키지에 포함되어 있다. 표준 입출력 스트림은 자바가 자동으로 생성하므로 개발자가 별도로 스트림을 생성하지 않아도 사용할 수 있다.
System 클래스에는 표준 입출력을 위해 다음과 같은 클래스 변수가 정의되어 있다.
클래스 변수 | 입출력 스트림 | 설명 |
System.in | InputStream | 콘솔로부터 데이터를 입력받음. |
System.out | PrintStream | 콘솔로 데이터를 출력함. |
System.err | PrintStream | 콘솔로 데이터를 출력함. |
'프로그래밍 언어 > Java + Kotlin' 카테고리의 다른 글
[Java] 스터디 15주차: 람다식 (0) | 2021.09.24 |
---|---|
[Java] 스터디 14주차: 제네릭 (0) | 2021.09.07 |
[Java] 스터디 12주차: 애노테이션 (0) | 2021.08.19 |
[Java] 스터디 11주차: Enum (0) | 2021.08.18 |
[Java] 스터디 10주차: 쓰레드 (0) | 2021.08.17 |