Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 직렬화와 역직렬화 완벽 가이드: 개념부터 예제 코드까지

직렬화(Serialization)는 객체의 상태를 바이트 스트림(byte stream) 형태로 변환하는 과정입니다. 객체의 클래스 또는 부모 클래스Serializable 또는 Externalizable 인터페이스를 구현하고 있다면 해당 객체는 직렬화가 가능하다고 말할 수 있습니다. 반대로 역직렬화(Deserialization)는 직렬화된 데이터를 다시 원래의 객체 복사본으로 변환하는 과정을 의미합니다.

transient 키워드의 역할

직렬화 과정에서 특정 변수의 상태는 바이트 스트림에 저장하고 싶지 않은 경우가 있습니다. 이때 transient 키워드를 사용하면 됩니다. JVM이 transient로 선언된 변수를 만나면 해당 변수의 원래 값을 무시하고 그 데이터 타입의 기본값을 저장합니다. 예를 들어 int 타입은 0, byte 타입은 0, float 타입은 0.0 등이 기본값으로 저장됩니다.

직렬화 구현 방법

객체의 직렬화는 FileOutputStreamObjectOutputStream 클래스를 통해 수행할 수 있으며, 역직렬화는 FileInputStreamObjectInputStream 클래스를 사용합니다.

예제 코드

import java.io.*;

public class SerializationTest implements Serializable {
    int a = 1, b = 2;
    transient int c = 3;

    public static void main(String[] args) throws Exception {
        SerializationTest obj = new SerializationTest();

        // 직렬화(Serialization)
        FileOutputStream fos = new FileOutputStream("serialization.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(obj);

        // 역직렬화(De-serialization)
        FileInputStream fis = new FileInputStream("serialization.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        SerializationTest test = (SerializationTest) ois.readObject();

        System.out.println("a = " + test.a);
        System.out.println("b = " + test.b);
        System.out.println("c = " + test.c);
    }
}

실행 결과

a = 1
b = 2
c = 0

결과 분석

실행 결과를 보면 변수 a와 b는 각각 초기값인 1과 2가 정상적으로 출력되지만, transient로 선언된 변수 c는 원래 값인 3이 아닌 기본값인 0이 출력됩니다. 이는 직렬화 과정에서 JVM이 transient 변수의 실제 값을 제외했기 때문입니다.

이처럼 transient 키워드는 비밀번호, 보안 정보처럼 직렬화 대상에서 제외해야 하는 민감한 데이터를 다룰 때 특히 유용하게 활용됩니다.