자바 입출력
스트림의 구분 기준
-
대상 기준
-
자료의 종류
- 바이트 단위로 읽고 쓰는 스트림: 동영상, 음악 파일 등을 읽고 쓸 때 사용
- FileInputStream, FileOutputStream 등
- 문자 단위로 읽고 쓰는 스트림: 바이트 단위로 자료를 처리하면 문자는 깨짐. 이에 따라 2바이트 단위로 처리하도록 구현된 스트림
-
기능
- 기반 스트림: 입력을 받는 소스나 출력을 할 대상에 직접 생성돼서 읽고 쓰는 기능을 함
- 보조 스트림: 소스에서 직접 읽고 쓰는 기능은 없지만 원래 있는 스트림에 추가적인 기능을 더해주는 스트림. 단일 바이트 스트림에 버퍼링 제공, 멀티 바이트 스트림에 문자로 변환 등
- 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자 매개변수로 포함한다.
- InputStreamReader, OutputStreamWriter 등(바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림)
- Buffered 스트림: 내부적으로 8192 바이트 배열을 가지고 읽거나 쓰기 기능을 제공하여 속도가 빨라진다.
- BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
- 직렬화, 역직렬화 지원하는 클래스: ObjectOutputStream, ObjectInputStream
객체 직렬화(Serialization)와 역직렬화(Deserialization)
직렬화
- 자바 직렬화란 자바 시스템 내부에서 사용되는 인스턴스를 파일에 쓰거나 네트워크로 전송하는 등 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터를 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술
- JVM의 메모리에 로드(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
- Serializable 인터페이스를 상속받아 사용
- 인스턴스의 정보가 외부로 유출되는 것이기 때문에 이에 대해 허용한다는 뜻으로 사용
- 구현 코드가 없는 maker interface
- transient: 해당 멤버변수는 직렬화할 때 저장하지 않겠다는 뜻
class Person implements Serializable {
String name;
transient String title;
public Person(){}
public Person(String name, String title){
this.name = name;
this.title = title;
}
public String toString(){
return name + ", " + title;
}
}
public class SerializationTest {
public static void main(String[] args) {
Person personLee = new Person("Lee", "Manager");
try(FileOutputStream fos = new FileOutputStream("serial.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos)){
oos.writeObject(personLee);
} catch(IOException e){
System.out.println(e);
}
}
}
역직렬화
- byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화(Deserialize)라고 부릅니다.
- 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 로드시키는 형태.
자바 직렬화의 장점
자바 직렬화는 자바 시스템에서 개발에 최적화되어 있다. 복잡한 데이터 구조의 클래스의 객체라도 직렬화 기본 조건만 지키면 큰 작업 없이 바로 직렬화가 가능하다. 물론 역직렬화도 마찬가지.