[Java 입출력] 보조 스트림과 직렬화 완벽 가이드
보조 스트림은 기본 스트림에 추가 기능을 제공하며, 객체 직렬화를 통해 객체를 저장하거나 전송할 수 있습니다.
참고용 노드스트림 종류
보조 스트림의 종류와 특징
기능별로 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();
-
참고로 노드 스트림(예: FileInputStream)은 언제나 필요하다.
💡 성능 최적화 팁
- 버퍼 사용으로 I/O 횟수 감소
- 버퍼는 임시로 데이터를 저장할 수 있는 메모리 공간
- 데이터를 모아서 처리할 수 있기 때문에 I/O 성능을 개선
- 적절한 버퍼 크기 설정
- 문자열 처리는 byte보단 char 단위 권장 -> 사용할 스트림 결정 예시 파트 참고
스트림 체이닝
필요에 따라 여러 보조 스트림을 연결 사용
여러 보조 스트림 연결 예시
// 변환 스트림, 버퍼 스트림 사용
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("file.txt")
)
);
사용할 스트림 결정 예시
알고리즘 풀때 주로 사용한 입출력 BufferedReader br = new BufferedReader(new InputStreamReader(System.*in*));
이것은 키보드에서 유니코드 문자를 안전하고 빠르게 읽는 것이었다.
보조 스트림의 적절한 활용은 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로 버전 관리
직렬화는 객체의 상태를 저장하거나 네트워크로 전송할 때 유용하게 사용됩니다.
댓글남기기