package CHAPTER13; // 패키지 선언

import java.io.FileOutputStream; // 파일 출력 스트림을 위한 FileOutputStream 클래스 가져오기
import java.io.IOException; // 입출력 예외 처리를 위한 IOException 가져오기
import java.io.ObjectOutputStream; // 객체 직렬화를 위한 ObjectOutputStream 클래스 가져오기
import java.io.Serializable; // 직렬화 가능한 클래스를 만들기 위한 Serializable 인터페이스 가져오기

// 직렬화 가능한 클래스 정의
class Person implements Serializable { // Serializable 인터페이스 구현하여 직렬화 가능하도록 설정
    private static final long serialVersionUID = 1L; // 직렬화 버전 ID 지정 (데이터의 일관성 유지)
    
    private String name; // 이름 필드
    private int age; // 나이 필드

    // 생성자: 이름과 나이를 초기화
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 객체 정보를 문자열로 반환하는 메서드
    public String toString() {
        return "이름: " + name + ", 나이: " + age;
    }
}

// 객체 직렬화 예제 클래스
public class C13_09_SerializationExample {
    public static void main(String[] args) {
        // Person 객체 생성
        Person person = new Person("홍길동", 30);

        // try-with-resources 문을 사용하여 자동으로 스트림을 닫음
        try (FileOutputStream fos = new FileOutputStream("person.ser"); 
             ObjectOutputStream oos = new ObjectOutputStream(fos)) { // 객체 직렬화를 위한 ObjectOutputStream 생성
            oos.writeObject(person); // person 객체를 직렬화하여 파일에 저장
            System.out.println("객체가 person.ser 파일에 저장되었습니다."); // 저장 완료 메시지 출력
        } catch (IOException e) { // 입출력 예외 발생 시 처리
            e.printStackTrace(); // 예외 정보 출력
        }
    }
}
