Inputstream, OutputStream을 공부하기 전 Stream에 대해서 먼저 알아보자
Stream
스트림은 '데이터의 흐름'이다. 배열 또는 컬렉션 인스턴스에 함수 여러개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. 데이터 입출력 시 모든 데이터를 형태와 관계없이 일련된 흐름으로 전송하는 것이 스트림 입출력 모델의 기본 개념이다.
특징
- 스트림은 FIFO 구조이다. FIFO(First In First Out) 구조란, 먼저 들어간 것이 먼저 나오는 형태로 스트림의 데이터는 순차적으로 흘러가며 순차적 접근 밖에 허용되지 않는다.
- 스트림은 단방향이다. 그렇기 때문에 자바에서 스트림을 사용하는 기능은 읽기와 쓰기가 동시에 이루어지지 않는다. 따라서 읽기 쓰기가 모두 필요하다면 읽는 스트림과 쓰는 스트림을 하나씩만 열어서 사용해야 한다.
- 병렬처리(multi-threading)가 가능하다. 하나의 작업을 둘 이상의 작업으로 잘게 나눠서 동시에 진행하는 것을 병렬처리(parallel processing)이라 한다.(즉, 스레드를 이요해 많은 요소를 빠르게 처리할 수있다.)
- 스트림은 지연될 수 있다. 스트림에 넣어진 데이터가 처리되기 전까지 스트림에 사용하는 스레드는 대기locking) 상태에 빠진다. 예를 들면 네트워크 상에서 데이터가 모두 전송되거나 발송받기 전까지 스레드는 대기 상태가 된다.
입출력 I/O
I/O는 입출력(input output)의 약자이다. 자바에서는 데이터를 외부에서 읽고 다시 외부로 출력하는 작업(입출력)에 스트림(Stream)을 사용한다.
- 입출력 작업의 예: 키보드, 파일, 네트워크에서 입력과 모니터, 파일, 네트워크의 출력
Byte Streams : 프로그램은 바이트 스트림을 8비트 I/O를 수행하기 위해 사용한다. 모든 바이트 스트림 클래스는 InputStream과 OutputStream의 자손 클래스이다. 많은 바이트 스트림 클래스가 있다.
*바이트 스트림을 사용하면 안되는 경우
위 같은 경우는 character 데이터가 포함되어 있다. 이런 경우 제일 좋은 I/O 방법은 Character streams을 이용하는 것이다. 바이트 스트림은 오직 기본형 타입에 적용해야 한다.
Character Streams
: Java 플랫폼은 character 변수는 Unicode 규칙을 사용한다. character stream I/O는 자동으로 로컬 문자set에서 내부적 포맷으로 해석된다. 바이트 스트림을 사용하는 대신 캐릭터 스트림을 사용하면 로컬문자 집합에 자동으로 적응하고 국제화 할 준비가 되어 있다.
표준 스트림
JAVA에서는 스크린과 키보드를 통한 입출력 방법인 표준 입출력을 제공한다. 표준 입출력을 제공하는 클래스는 java.lang.System으로 멤버 변수인 in, out, err을 이용해서 표준 입력, 표준 출력, 표준 에러를 제공한다.
System.in
InputStream 형태로 지정되어 있다.
InputStream 클래스는 최상위 클래스이면서 추상 클래스이다. 따라서 InputStream은 객체를 생성할 수 없는 클래스이다.
System.in을 통하여 접근되는 객체는 자바 버추얼 머신이 메모리로 올라오면서 미리 객체를 생성해 놓는, 대표적인 객체이다. 자료형이 InputStream이기 때문에 바이트 단위로만 입출력이 허용된다.
키보드에서 입력하는 자료는 때에 따라서 두 바이트가 합쳐져야 의미를 가지는 경우가 있다. 그래서 System.in을 통하여 읽을 경우에는 영문과 한글의 처리를 분리해서 구성해야 제대로 인식할 수 있다.
System.out
System.out 변수는 표준 출력 장치 객체를 가리키는 대표적인 출력 변수이다. 자바 언어를 처음 배우자마자 사용하는 문장 중 하나가 System.out.println() 메소드다.
System.out은 PrintStream 타입으로 선언되어 있는데 PrintStream은 OutputStream 클래스의 후손 클래스로 Exception을 안전하게 처리한 메소드로만 구성되어 있다. 이런 이유로 System.out 을 이용하여 출력할 때는 try, catch 구문을 작성할 필요가 없다.
System.err
System.err 객체는 표준 에러 출력 장치를 의미하는데 일반적으로 System.out과 마찬가지로 모니터로 지정되는 경우가 많다. 일반적인 정상 출력은 System.out으로 나가고, 오류가 발생할 때 알려주어야 할 내용은 System.err로 나간다고 볼 수 있다. 이 변수의 타입도 PrintStream 클래스 타입으로 System.out을 사용하는 방법과 동일하다.
참고
https://haemanlee.tistory.com/13
https://www.joinc.co.kr/w/Site/Java/Documents/ComputerScienceUsingJava/Chapter09
https://scshim.tistory.com/283?category=1022880
https://lipcoder.tistory.com/entry/Java-입출력-InputOutput
'언어 > JAVA' 카테고리의 다른 글
Stream (0) | 2021.12.16 |
---|---|
Serialize(직렬화) (0) | 2021.12.14 |
Hash (0) | 2021.12.07 |
22장 자바 컬렉션 part1 (0) | 2021.11.05 |
21장 제네릭 (0) | 2021.11.04 |