본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 28일차 (2023-06-30) 자바 기초 DAY26_자바 프로그래밍_인스턴스를 통째로 입출력하기(객체 직렬화)_개인프로젝트 - 마트 관리 시스템

by prometedor 2023. 6. 30.
## 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 에도 동일하게 적용하기