반응형
01. 객체 직렬화(Object Serialization)란?
- 객체를 byte 배열(원시 데이타의 모임)로 변환하여 입력 또는 출력 처리하기 위한 기능을 제공
1) 객체 직렬화의 필요성
- 하나의 프로그램이 있고, 파일이 있다고 가정하자
- 파일에서 프로그램으로 보낼 때, 프로그램에서 파일로 보낼 때 원시데이터로 밖에 못보낸다!
- 그래서 여기서 부터 ~ 여기까지 하나의 객체야! 라는 것을 알려줘야한다.
- 바로 그 기능이 객체 직렬화기능이다.
- 그래서 실제 데이타가 보내질 때는 원시데이타형태이지만,
- 객체직렬화를 통해 여기서 부터 ~ 여기까지 하나의 객체야!라는 것을 알 수 있다.
2) 객체 직렬화 클래스로 선언하는 방법
- (필요에 따라 둘 중 하나 사용하기)
방법1. Serializable인터페이스 상속받아 선언 - 더 많이 씀
- 추상메소드가 없어서 오버라이드선언 필요 없음
- 객체의 모든 필드값을 ➡️ Byte 배열로 변환하여 입력 또는 출력 처리함
- 즉, 객체가 가진 모든 필드값을 객체 직렬화하여 입출력
public class Member implements Serializable { }
방법2. Externalizable인터페이스 상속받아 선언
- writeExternal 메소드와 readExternal 메소드를 오버라이드 선언
- 오버라이드 선언된 메소드에서 원하는 필드값을 ➡️ Byte 배열로 변환하여 입력 또는 출력 처리함
- 즉, 내가 원하는 값만 직렬화하여 입출력
public class Member implements Externalizable{
@Override
public void writeExternal(ObjectOutput out) throws IOException { }
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { }
}
02. 회원정보를 파일에 저장하고 출력하는 프로그램
1) Member.java
package xyz.itwill.io;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.Serializable;
//회원정보(아이디, 이름, 전화번호)를 저장하기 위한 클래스
//=> 🚌 객체 단위로 입력 또는 출력 처리하는 클래스는 반드시 객체직렬화 클래스 선언
public class Member implements Serializable{
//🚌객체직렬화 클래스
// => 클래스를 구분하기 위해 식별자를 저장하는 serialVersionUID 필드 선언하는 것을 권장
// => 있으면 나중에 해석하기도 편하고, 저장하고 입출력속도가 빨라짐
// => 이클립스에서는 serialVersionUID 필드값을 자동으로 생성하는 기능을 제공함
// => 🚌객체직렬화 클래스를 구분하기 위한 식별자 선언
private static final long serialVersionUID = -3306639107947980039L;
//필드
private String id;
private String name;
private String phone;
//생성자
public Member() { }
public Member(String id, String name, String phone) {
super();
this.id = id;
this.name = name;
this.phone = phone;
}
//Setter & Getter메소드
public String getId() {return id;}
public void setId(String id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getPhone() {return phone;}
public void setPhone(String phone) {this.phone = phone;}
//toString()을 오버라이드 선언한 메소드
@Override
public String toString() {
return "아이디 = " + id+", 이름 = "+name + ", 전화번호 = "+ phone;
}
}
2) MemberSaveApp.java
package xyz.itwill.io;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
//회원정보(Member객체)를 파일에 전달하여 저장하는 프로그램
public class MemberSaveApp {
public static void main(String[] args) throws Exception {
//출력스트림 : ObjectOutputStream보조스트림이용
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c:/data/member.txt"));
//ObjectOutputStream.writeObject(Object o)메소드 호출 시 NotSerializableException 발생
// => 🚌NotSerializableException예외
// => 객체 직렬화 처리하지 않은 클래스의 객체를 출력스트림으로 전달할 경우 발생되는 예외
// => 출력스트림으로 전달할 객체의 클래스를 🚌객체직렬화 처리하면 예외 미발생
out.writeObject(new Member("abc123","홍길동","010-1324-4321"));
out.writeObject(new Member("xyz123","홍길동","010-4531-7888"));
out.writeObject(new Member("lkj123","홍길동","010-4654-2454"));
out.close();
System.out.println("c:\\data\\member.txt 파일에 회원정보를 저장 하였습니다.");
}
}
3) MemberLoadApp.java
package xyz.itwill.io;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
//파일에 저장된 회원정보를 읽어 출력하는 프로그램
public class MemberLoadApp {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//압력스트림 : ObjectInputStream보조스트림이용
ObjectInputStream in=new ObjectInputStream(new FileInputStream("c:/data/member.txt"));
System.out.println("<<회원목록>>");
while(true) {
//예외처리 (try구문)
try {
//ObjectInputStream.readObject() 메소드 호출시 파일 커서가 EOF 위치에 있을 경우 EOFException 발생
Member member=(Member)in.readObject();
System.out.println(member); //Member.toString() 메소드 자동 호출
//예외처리 (catch구문)
} catch (EOFException e) {
break;
}
}
in.close();
}
}
03. 실제 파일을 사용하는 방법
step1.파일(반영구적)에서 읽어들인 모~~든 정보들을 모두 메모리(휘발성)에 옮긴다.
- (메모리 위) : arrayList 사용해 정보들 나열
step2.메모리 위에서 정보들에 대한 처리가 이루어진다.
- 회원정보 추가(C), 읽기(R), 변경(U), 삭제(D) .. 등등
step3. 프로그램을 종료하기 전 다시 파일(반영구적)로 정보들 옮긴 후 프로그램을 종료한다.
반응형
'java > java.io' 카테고리의 다른 글
[java.io] 5. ✏️텍스트 파일 편집기 프로그램 - 메모장 (0) | 2024.07.01 |
---|---|
[java.io] 3. Data보조스트림 | Object보조스트림 (1) | 2024.06.30 |
[java.io] 2. File(파일)클래스 (0) | 2024.06.30 |
[java.io] 1. 입출력스트림(원시데이타기반 | 문자데이타기반) (0) | 2024.06.30 |