[Java 입출력] 보조 스트림과 직렬화 완벽 가이드

보조 스트림은 기본 스트림에 추가 기능을 제공하며, 객체 직렬화를 통해 객체를 저장하거나 전송할 수 있습니다.

참고용 노드스트림 종류

Image



보조 스트림의 종류와 특징

기능별로 3가지로 나뉜다.

  • 변환 스트림: 바이트 스트림을 문자 스트림으로 변환 한다.

  • 버퍼 스트림: 버퍼를 사용하여 I/O 성능을 향상 한다.

  • 객체 전송: 주로 writeObject(), readObject() 메소드를 사용해 “실제 사용”한다.

    • // 객체 저장
      ObjectOutputStream oos = new ObjectOutputStream(
          new FileOutputStream("object.dat")
      );
      oos.writeObject(user);
          
      // 객체 읽기
      ObjectInputStream ois = new ObjectInputStream(
          new FileInputStream("object.dat")
      );
      User user = (User) ois.readObject();
      

Image

참고로 노드 스트림(예: FileInputStream)은 언제나 필요하다.


💡 성능 최적화 팁

  • 버퍼 사용으로 I/O 횟수 감소
    • 버퍼는 임시로 데이터를 저장할 수 있는 메모리 공간
    • 데이터를 모아서 처리할 수 있기 때문에 I/O 성능을 개선
  • 적절한 버퍼 크기 설정
  • 문자열 처리는 byte보단 char 단위 권장 -> 사용할 스트림 결정 예시 파트 참고



스트림 체이닝

필요에 따라 여러 보조 스트림을 연결 사용

Image


여러 보조 스트림 연결 예시

// 변환 스트림, 버퍼 스트림 사용
BufferedReader br = new BufferedReader(
    new InputStreamReader(
        new FileInputStream("file.txt")
    )
);



사용할 스트림 결정 예시

알고리즘 풀때 주로 사용한 입출력 BufferedReader br = new BufferedReader(new InputStreamReader(System.*in*)); 이것은 키보드에서 유니코드 문자를 안전하고 빠르게 읽는 것이었다.

Image

보조 스트림의 적절한 활용은 I/O 성능 향상과 코드 가독성 개선에 큰 도움이 됩니다.



직렬화 기본 구현

Serializable 인터페이스 구현

class Demo implements Serializable {
    private static final long serialVersionUID = 129348938L;
    private String name;
    private int age;
    transient private String password; // 직렬화 제외
    
    public Demo(String name, int age) {
        this.name = name;
        this.age = age;
    }
}



객체 직렬화 과정

Demo object = new Demo("John", 25);
try (FileOutputStream file = new FileOutputStream("object.ser");
     ObjectOutputStream out = new ObjectOutputStream(file)) {
    out.writeObject(object);
    System.out.println("객체 직렬화 완료");
}



역직렬화 구현

try (FileInputStream file = new FileInputStream("object.ser");
     ObjectInputStream in = new ObjectInputStream(file)) {
    Demo object = (Demo)in.readObject();
    System.out.println("객체 역직렬화 완료");
    System.out.println("이름: " + object.name);
    System.out.println("나이: " + object.age);
}



주의사항

💡 직렬화 특징

  • static 필드는 직렬화되지 않음
  • transient 필드는 직렬화에서 제외
  • 모든 포함 객체도 Serializable 구현 필요
  • serialVersionUID로 버전 관리

직렬화는 객체의 상태를 저장하거나 네트워크로 전송할 때 유용하게 사용됩니다.

댓글남기기