순서가 있는 데이터의 연속적인 흐름
장치와 프로그램 사이를 연결하는 가상의 파이프로, 이 파이프를 통해 바이트들이 순서대로 이동
장치(키보드, 모니터)는 서로 제어하는 방법이 각각 다르지만, Stream이라는 공통적인 입출력 모델을 적용하면 입출력을 동일한 방식으로 처리할 수 있다.
System.out.print() 같은 메서드는 콘솔이라는 독립적인 장치로부터 문자 기반으로 데이터를 전송하는데, 프로그램과 콘솔은 완전히 떨어져 있기 때문에 Stream이 연결 고리 역할을 해준다.
입력 : 외부 장치에서 컴퓨터의 주기억 장치로 데이터가 이동
출력 : 컴퓨터의 주기억 장치에서 외부 장치로 데이터가 이동
프로그램이 실행되는 동안 사용하는 데이터는 모두 읽고 쓰기가 가능한 메모리(RAM)에 저장된다.
하나의 Stream으로 입출력을 동시에 수행하지 못한다.
양방향 전송이 필요하면 출력 Stream과 입력 Stream 각각이 필요하다.
InputStream bIn = new BufferedInputStream(System.in);
// BufferedInputStream = 2차 Stream
// System.in = 1차 Stream
BufferedInputStream 객체를 사용해서 데이터를 1바이트 단위로 읽어들이는 read() 메서드를 실행하면 시스템 내부적으로 버퍼를 준비하고, 이 버퍼를 사용하여 키보드에서 입력받은 데이터에서 버퍼의 크기만큼 한꺼번에 많은 데이터를 가져온다.
이렇게 채워진 버퍼(buffer)로부터 1바이트씩 읽어들여 프로세스로 전달한다.
키보드 문자열 ➡️ 한 바이트 씩 전송 ➡️ BufferedInputStream 객체에 담겨서 전송된 데이터는 버퍼에 담아 한꺼번에 처리 ➡️ read() 메서드로 1바이트씩 프로세스로 전달됨
버퍼(buffer) : 임시 저장소로 데이터를 목적지로 바로 보내지 않고 중간에 입력이나 출력 버퍼를 두고 전송한다.
버퍼링(buffering) : 바이트당 오버헤드(overhead)를 최소화하는 기법
new BufferedInputStream(System.in)처럼 기존의 기능에 추가 기능을 더하는 프로그래밍 패턴을 Decoration 패턴이라고 한다. IO 클래스가 대표적이다.
자바 객체를 하드디스크에 저장하거나 네트워크로 전송하기 위해 바이트 배열로 변환하고, 또 역으로 저장되거나 전송받은 바이트 배열을 자바 객체로 변환하는 기술
데이터를 Stream에 전송할 수 있도록 바이트 단위로 그리고 일렬로 변환하는 작업
마샬링(marshalling)이라고도 한다.
기본 자료형(boolean, char, byte, short, int, long, float, double)은 직렬화가 가능하다.
Serializable 인터페이스를 구현한 객체도 가능하다.
transient 제어자가 사용된 속성(멤버 변수)은 전송되지 않는다.