
예시
package ex15; import java.io.IOException; import java.io.InputStream; public class StreamEx01 { public static void main(String[] args) { InputStream input = System.in; // 키보드로부터 입력받음 = Input try { int value = input.read(); System.out.println("받은 값 : " + value); } catch (IOException e) { throw new RuntimeException(e); } } }


컴퓨터 : 3가지 계층으로 나눔
Application > OS > HardWare
Application = 코드 : 프로그램 > 실행 : 프로세스
인간의 영역 → 인간이 이해하기 쉬운 Byte로 전송

Application 기준으로 Input, Output 구분
ex) Application 이 모니터로 Output = 출력
메모리에 데이터를 넣는 것 = 변수에 데이터를 넣는 것
Stream : Byte들의 연속적인 흐름
하나의 방향만 가능함 → 입력 Stream과 출력 Stream이 각각 필요함

Stream이 없으면 OS로 데이터 전송이 안됨
Character Stream : 문자 단위로 입출력
유니코드로 저장된 정보를 처리할 때 사용
Reader(입력) / Writer(출력)
ByteStream : 끝이 없는 Byte저장 공간
Byte의 흐름
1Byte 씩 전송되는 8bit 단위로 입출력을 수행
InputStream(입력) / OutputStream(출력)
유니코드로 저장된 정보를 처리할 때 불편함

임시로 만들어진 파일에 데이터가 들어옴
파일 : Application 과 OS의 매개체 역할을 하는 임시로 만들어진 파일
소켓 : 외부 세상에 데이터를 전송할 때
전송된 데이터는 누적되지 않고 OS가 소비할 때 지워짐
소비를 못하면 wait 걸림 → 출력이 밀려서 데이터가 쌓이고 결국 소멸됨
ex) 공급자가 데이터를 공급할 때 1초에 1개씩 전송할 때
1초에 1개씩 소비가 가능하면 상관없음
서로 같은 모니터를 공유해서 쓰기에 1초 만에 소비가 안되고
연속적으로 데이터가 와도 바빠서 6초 만에 소비할 수 있음
그럼 소멸될 수 있음
ex) 

ByteStream이라서 1Byte씩 읽고 버려진 것
동시에 두 개가 내려와도 os가 한 개만 소비할 수 있음
⇒ Buffer = 보조 Stream이 필요함
Buffer에 저장해야 소멸 안되고 꺼내 쓸 수 있음
Buffer가 필요할 때 : 공급이 소비보다 많을 때 필요함
버퍼링 : 소비가 공급보다 빠를 때, 소비가 공급보다 느릴 때 발생
Buffer의 특징 : 쓰기, 읽기
한 번 사용되고 난 후에는 다시 사용되지 않음
BufferWriter : Output Stream = Output Buffer
보조 Byte가 몇 개인지는 개발자가 설정할 수 있음


데이터가 전송되는 과정

프로토콜 : 보조 Stream의 크기만큼 다 소비함
Buffer가 다 차지 않으면 소비하지 않음
flush : 다 차지 않았을 때 강제로 흘려보내는 것
전체 물길을 다 열어주는 것
통신의 기본 / 데이터 전송의 기본
보조 Stream이 Buffer가 되면 특이하게 작동함
통신할 때 사이즈를 고정해 놓으면 안됨
보조 스트림이 버퍼링을 제공하면 작업은 버퍼에 먼저 쓰이고, 일정한 양이 쌓이거나 특정 조건이 충족되면 실제 입출력 스트림으로 데이터가 전송
개발자 입장에서는 Buffer에 데이터를 담아서 다 전송하면 끝
프로세스마다 보조 thread가 만들어져서 실행이 됨
OS도 해당 Application 에 보조 Stream을 가지고 있음

BufferedReader : Input Buffer
ByteStream이 아님!!

데이터의 입출력 및 Stream 처리
- Application 계층
- 특정 목적을 위해 데이터를 생성하거나 처리 > 다른 시스템 컴포넌트와 공유
- OS 계층
- Application와 Hardware의 인터페이스 역할
- 시스템 자원을 관리
- 데이터 입출력과 스트림 처리
여러 Application간의 충돌을 방지하고 효율적인 자원 할당
OS 가 Hardware 와의 통신을 중개, 입출력 장치를 관리
파일 시스템, 네트워크 프로토콜, 디바이스 드라이버 등
- Hardware 계층
- 컴퓨터의 물리적인 부분을 의미
- 데이터가 Hardware 로 흐를 때, 버스를 통해 데이터가 전송
CPU, 메모리, 입출력 장치, 버스 등
CPU 명령어에 따라 데이터를 처리, 주변 장치와 통신
파일에 데이터 쓰기 과정
- Application 계층
- 파일에 데이터를 쓰기 위해 파일에 대한 입출력 스트림을 생성
OS 를 통해 파일과 관련된 입출력 장치와 연결
- OS 계층
- Application 의 요청을 받아 파일 시스템을 통해 파일에 대한 접근을 허용
- 데이터는 버퍼에 일시적으로 저장되어 효율적인 입출력을 지원
해당 입출력 장치와의 통신을 관리
파일 시스템을 통해 데이터를 저장할 위치를 결정합니다.
- Hardware 계층
- 버스를 통해 데이터를 주고받음
실제로 데이터를 저장할 디스크 등의 입출력 장치와 통신
CPU는 입출력 명령을 수행
메모리에 있는 데이터를 버스를 통해 입출력 장치로 전송하거나 그 반대로 이루어짐
Client-Server 소켓 통신
- Application 계층
- 클라이언트 애플리케이션
- 서버 애플리케이션
사용자가 작성한 소프트웨어
서버에 연결하기 위해 소켓을 생성하고 서버에 데이터를 전송하는 역할
클라이언트로부터의 연결을 기다림
연결이 수립되면 해당 클라이언트와 데이터를 주고받는 역할
- OS 계층
- 클라이언트 OS
- 서버 OS
클라이언트 애플리케이션이 요청한 소켓을 생성
서버의 IP 주소 및 포트에 연결
소켓을 통한 데이터 전송을 지원
데이터가 TCP/IP 프로토콜을 통해 전송
서버 애플리케이션이 클라이언트의 연결을 받아들임
해당 클라이언트와의 소켓 통신을 위한 리소스를 할당
소켓을 통한 데이터 전송을 관리
데이터가 TCP/IP 프로토콜을 통해 전송
- Hardware 계층
- 클라이언트 하드웨어
- 서버 하드웨어
클라이언트 애플리케이션이 동작하는 컴퓨터의 하드웨어는 소켓을 생성
네트워크 인터페이스를 통해 데이터를 전송
서버 애플리케이션의 서버 컴퓨터는 클라이언트로부터의 연결을 받아들임
네트워크 인터페이스를 통해 클라이언트와의 데이터를 주고받음
Share article