Java(8)

Jinny·2021년 6월 14일
0

JAVA

목록 보기
6/8

자바 입출력

스트림의 구분 기준

  • 대상 기준

    • 자바에서는 입력과 출력 스트림을 동시에 쓰지 않고 구분해서 쓴다.

    • 입력 스트림/출력 스트림

  • 자료의 종류

    • 바이트 단위로 읽고 쓰는 스트림: 동영상, 음악 파일 등을 읽고 쓸 때 사용
      • FileInputStream, FileOutputStream 등
    • 문자 단위로 읽고 쓰는 스트림: 바이트 단위로 자료를 처리하면 문자는 깨짐. 이에 따라 2바이트 단위로 처리하도록 구현된 스트림
      • FileReader, FileWriter 등
  • 기능

    • 기반 스트림: 입력을 받는 소스나 출력을 할 대상에 직접 생성돼서 읽고 쓰는 기능을 함
    • 보조 스트림: 소스에서 직접 읽고 쓰는 기능은 없지만 원래 있는 스트림에 추가적인 기능을 더해주는 스트림. 단일 바이트 스트림에 버퍼링 제공, 멀티 바이트 스트림에 문자로 변환 등
      • 직접 읽고 쓰는 기능은 없으므로 항상 기반 스트림이나 또 다른 보조 스트림을 생성자 매개변수로 포함한다.
      • 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으로 로드시키는 형태.

자바 직렬화의 장점

자바 직렬화는 자바 시스템에서 개발에 최적화되어 있다. 복잡한 데이터 구조의 클래스의 객체라도 직렬화 기본 조건만 지키면 큰 작업 없이 바로 직렬화가 가능하다. 물론 역직렬화도 마찬가지.

  • 사용되는 곳:
    • 서블릿 세션
    • 캐시
profile
삐약 응애

0개의 댓글