본문 바로가기

Languages/JAVA

입출력 I/O

입출력과 스트림

 

 

input : 저장, 읽기
output : 출력

 

스트림

 : 입출력을 수행하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무언가가 필요한데 이것을 스트림이라고 정의.

 입출력에서의 스트림은 14장의 스트림과 같은 용어를 쓰지만 다른 개념이다.

 

'스트림이란 데이터를 운반하는데 사용되는 연결통로이다.'

 

 연속적인 데이터의 흐름.

 단방향 통신, 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.

 큐(queue)와 같은 FIFO(first in first out)구조로 되어있다.(생각하면 됨)

 바이트 단위로 데이터를 전송.

 

여러 종류의 입출력 스트림

이들은 모두 InputStream 또는 OutputStream의 자손들이며, 각각 읽고 쓰는데 필요한 추상 메서드를 자신에 맞게 구현.

 

보조스트림

 : 실제 데이터를 주고받는 스트림은 아니기 때문에 데이터를 입출력할 수 있는 기능은 없지만, 스트림의 기능을 향상시키거나 새로운 기능을 추가할 수 있다.

보조 스트림의 종류

 

문자기반 스트림

 : C언어와 달리 Java는 한 문자를 의미하는 char형이 1byte가 아니라 2byte이기 때문에 바이트 기반의 스트림으로 2byte인 문자를 처리하는 데는 어려움이 있다. 이 점을 보안하기 위해서 문자기반의 스트림이 제공된다.

 

바이트 기반 스트림과 문자 기반 스트림은 이름만 조금 다를 뿐 활용방법은 거의 같다.

보조 스트림 역시 같다.

 

File

 : 파일은 기본적이면서도 가장 많이 사용되는 입출력 대상이다.

 

직렬화

 : 객체를 데이터  스트림으로 만드는 것.

  객체에 저장된 데이터를 스트림에 쓰기(write)위해 연속적인(serial) 데이터로 변환하는것.

  반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화(deserialization)라고 한다.

 

 

사실 객체에는 메서드가 포함되지 않는다.

인스턴스변수는 인스턴스마다 다른 값을 가질 수 있기 때문에 별도의 메모리공간이 필요하지만 

메서드는 변하는 것이 아니라서 메모리를 낭비해가면서 인스턴스마다 같은 내용의 메서드를 포함시킬 이유는 없다.

직렬화, 역직렬화를 사용하기 위해서 ObjectInputStream, ObjectOutputStream을 사용하면 된다.

InputStream과 OutputStream을 직접 상속받앗지만 기반스트림을 필요로 하는 보조스트림이다.

 

 

직렬화가 가능한 클래스 만들기

 : 직렬화하고자 하는 클래스가 java.io.Serializable 인터페이스를 구현하도록 하면 된다.

 

'Languages > JAVA' 카테고리의 다른 글

네트워킹  (0) 2020.04.20
람다와 스트림  (0) 2020.04.13
Java 쓰레드 (진행중)  (0) 2020.04.09
열거형(enum), 어노테이션  (0) 2020.04.08
Java 제네릭스(Generics)  (0) 2020.04.08