## 32. 인스턴스를 통째로 입출력하기(객체 직렬화)
- ObjectInputStream/ObjectOutputStream 사용법
- java.io.Serializable 인터페이스 사용법
- transient modifier 사용법 (나중에)
인스턴스를 통째로 입출력하기(객체 직렬화)
ObjectInputStream/ObjectOutputStream 사용법
ㄴ ObjectInputStream 클래스는 Java의 직렬화된 객체를 읽어오기 위한 기능을 제공하는 클래스
ㄴ InputStream을 상속하며, 객체 스트림 형식으로 저장된 데이터를 역직렬화하여 Java 객체로 복원할 수 있음
App.java
App.java
=>
App.java
ㄴ for 루프를 사용하여 memberList에 있는 각 Member 객체를 out.writeObject(member)를 통해 직렬화하여 파일에 저장합니다.
직렬화(Serialization) 란?
ㄴ 객체를 바이트 스트림으로 변환하는 과정을 말함
=> 이렇게 직렬화된 객체는 파일에 저장하거나 네트워크를 통해 전송할 수 있음
=> 직렬화된 객체는 나중에 역직렬화(Deserialization)하여 원래의 객체로 복원할 수 있음
ㄴ Java에서는 java.io.Serializable 인터페이스를 구현하는 클래스는 직렬화할 수 있음 => 이는 자바에서만 가능함
ㄴ Serializable 인터페이스를 구현한 클래스의 인스턴스는 ObjectOutputStream을 사용하여 직렬화할 수 있고, ObjectInputStream을 사용하여 역직렬화할 수 있음
ㄴ 직렬화된 객체의 클래스가 변경되지 않도록 주의해야 함 => 클래스 변경이 발생하면 역직렬화 시 오류가 발생할 수 있음
App.java
ㄴ 파일은 member.data2 라는 새로운 이름으로 저장하도록 변경
=> Item 과 Board 도 동일하게 적용
App.java
ㄴ 저장할 파일 이름 변경
App.java
ㄴ Member 와 Item 도 앞으로의 확장성을 고려하여 Board 와 동일하게 파일이름과 List 객체를 넘겨주도록 구현
=>
App.java
App.java
App 클래스 실행하여 테스트
ㄴ 메인에서 0 입력하여 저장 시 오류 발생
=> Serializable 이용하자!
java.io.Serializable 인터페이스 사용법
Member.java
ㄴ Member 클래스가 Serializable 인터페이스를 구현하고 있다는 코드
=> 이는 Member 클래스가 직렬화 가능하다는 것을 나타냄
ㄴ Serializable 인터페이스는 구현할 메서드를 가지지 않으며, 단지 직렬화 가능한 클래스임을 표시하는 마커 인터페이스임
ㄴ Serializable 인터페이스를 구현하는 클래스는 직렬화 및 역직렬화에 참여할 수 있음
Member.java
ㄴ serialVersionUID는 Serializable 인터페이스를 구현한 클래스의 직렬화 버전을 식별하기 위한 고유한 식별자임
=> 이 값은 직렬화된 객체를 역직렬화할 때 사용되며, 직렬화된 클래스의 구조가 변경되었는지 여부를 확인 가능
ㄴ serialVersionUID 값을 명시적으로 정의함으로써 클래스의 직렬화 버전을 설정하고, 이 값을 기준으로 역직렬화 시 클래스의 버전이 호환되는지 확인할 수 있음
ㄴ 클래스의 구조가 변경되었을 때 버전 충돌을 방지
=> 직렬화된 객체를 역직렬화할 때 클래스의 구조가 변경되었을 경우, serialVersionUID 값을 통해 역직렬화 시도가 실패하도록 할 수 있음
ㄴ 역직렬화 시 버전 호환성을 제어할 수 있음 => serialVersionUID를 변경하여 구버전과 신버전의 호환성을 관리할 수 있음
ㄴ serialVersionUID 값은 long 형식으로 작성되며, 일반적으로 상수로 선언하여 하드코딩됨
=> 값을 지정하지 않으면 컴파일러가 자동으로 생성한 값을 사용
ㄴ 버전 관리를 위해 명시적으로 serialVersionUID 값을 설정하는 것이 좋음
=> 클래스의 구조가 변경될 때마다 serialVersionUID 값을 적절하게 업데이트해야 함
App 클래스 실행하여 테스트
ㄴ 적용 후 테스트 시 serialVersionUID 를 적용한 Member 는 오류 발생하지 않음
=> 나머지도 모두 바꿔주기 (item, board)
App 클래스 실행하여 테스트
ㄴ 오류 발생하지 않음
board.data2 파일 확인
App.java
ㄴ 저장된 파일 loadData() 메서드를 통해 불러오려면 저장된 파일 이름과 각 List 객체를 파라미터로 넘겨줘야함
=> 각각 loadMember, loadItem, loadboard 수정
App.java
=>
ㄴ ITem, Board 에도 동일하게 적용하기