[Codeit Review]/알고리즘과 자료구조

[05] 객체 직렬화

uzlru 2026. 1. 30. 17:13

01. 객체 직렬화와 역직렬화

1. 객체 직렬화 (Seriallzation)

객체 직렬화란 메모리에 존재하는 객체를 바이트(byte) 형태로 변환하여 저장 및 전송할 수 있도록 만드는 과정을 의미한다. 이러한 객체 직렬화는 휘발성 메모리에 임시로 저장됐다가 사라지는 객체를 파일, 데이터베이스(DB), 네트워크 전송 데이터와 같은 외부 자원으로 변환할 때 사용된다.

 

대표적인 클래스  
ObjectOutputStream 객체를 바이트 스트림으로 변환하여 파일 등에 저장
FileOutputStream 실제 파일에 데이터를 기록하는 역할

 

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class SerializeExample {
    public static void main(String[] args) {
        User user = new User("Alice", 20);

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.dat"))) {
            oos.writeObject(user); // 객체를 파일로 직렬화
            System.out.println("직렬화 완료: user.dat에 저장되었습니다.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

2. 객체 역직렬화 (Deseriallzation)

객체 역직렬화란 객체 직렬화의 반대 개념으로, 바이트 형태로 저장된 데이터를 다시 객체로 복원하는 과정을 의미한다.

 

대표적인 클래스  
ObjectInputStream 바이트 데이터를 읽어 객체로 복원
FileInputStream 파일에서 데이터를 읽어오는 역할

 

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class DeserializeExample {
    public static void main(String[] args) {
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.dat"))) {
            User user = (User) ois.readObject(); // 객체 복원
            System.out.println("역직렬화 완료: " + user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

3. 객체 직렬화 및 역직렬화 흐름

[그림 1] 객체 직렬화 및 역직렬화 흐름

 

[그림 2] 구체적인 직렬화 전체 흐름 시각화

 


 

02. Seriallzable 인터페이스

seriallzable 인터페이스란 객체 직렬화를 위해 클래스가 반드시 구현해야 하는, 메서드가 하나도 없는 표식 인터페이스(Maker Interface)이다. 즉, 특별한 기능을 제공하지는 않지만 JVM에게 해당 클래스가 객체 직렬화 가능한 클래스임을 표시하는 역할을 수행한다.

 

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }
}

 

1. serialVersionUID

serialVersionUID란 해당 클래스의 고유 버전 번호이다. 직렬화 된 객체를 다시 복원하고자 할 때, JVM은 메모리에 저장된 객체 내부의 serialVersionUID와 해당 클래스의 serialVersionUID의 일치 여부를 확인하여 안전성을 검사한다. 즉, serialVersionUID란 클래스의 구조가 변경되면 다른 버전의 클래스라고 판단하여 객체 복원을 막는 안전장치를 뜻한다.

 

이러한 serialVersionUID는 자동으로 생성되지만, 예측 불가능한 충돌 문제를 방지하기 위해 명시적으로 선언해야 한다. 또한 클래스 구조 변경되었고, 이전 파일과 호환성을 유지할 필요가 없다면 serialVersionUID를 증가시킬 수 있다.

 

상황 serialVersionUID
기존 직렬화 파일과 호환 필요 유지
완전히 새로운 객체 버전 배포 변경
필드 추가/삭제 후도 읽기 가능해야 함 유지

 

public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private int age;
}

 

 

 

 

'[Codeit Review] > 알고리즘과 자료구조' 카테고리의 다른 글

[04] File I/O 기초와 활용  (0) 2026.01.30
[03] 제네릭 타입과 메서드  (0) 2026.01.30
[02] 주요 자료 구조  (0) 2026.01.27