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

Java에서 serialVersionUID의 중요성과 역할 완벽 정리

serialVersionUID란 무엇인가?

serialVersionUID는 Java에서 직렬화(Serialization)된 객체의 버전을 식별하기 위해 사용되는 고유한 ID입니다. 이 값은 반드시 private static final long 타입의 변수로 선언해야 하며, 컴파일러가 클래스의 상태와 클래스 속성들을 기반으로 계산하여 생성합니다. JVM은 파일로부터 객체의 상태를 읽어들일 때 이 번호를 참조하여 해당 객체의 상태를 정확하게 식별합니다.

serialVersionUID의 핵심 역할

  • 버전 호환성 검증: 역직렬화(Deserialization) 과정에서 serialVersionUID를 사용하여 직렬화된 객체의 송신자와 수신자가 로드한 클래스가 직렬화 관점에서 서로 호환되는지 확인합니다.
  • 예외 발생 조건: 역직렬화하려는 객체의 클래스 구조가 직렬화 당시의 클래스와 다르다면 InvalidClassException이 발생할 수 있습니다.
  • 기본값 자동 생성: serialVersionUID를 명시적으로 지정하지 않으면, 런타임이 클래스의 다양한 특성(클래스 이름, 인터페이스, 필드, 메서드 등)을 기반으로 기본 serialVersionUID 값을 자동으로 계산합니다.
💡 팁: 런타임이 계산한 기본값은 컴파일러 구현에 따라 달라질 수 있으므로, 클래스 변경 시 예기치 않은 InvalidClassException을 방기 위해서는 serialVersionUID를 명시적으로 선언하는 것이 좋습니다.

예제 코드

다음은 Employee 클래스에 serialVersionUID를 선언하고 객체를 직렬화하여 파일에 저장하는 예제입니다.

import java.io.*;
class Employee implements Serializable {
    private static final long serialVersionUID = 5462223600l;
    int empId;
    String name;
    String location;
    Employee(int empId, String name, String location) {
        this.empId = empId;
        this.name = name;
        this.location = location;
    }
    void empData() {
        System.out.println("Employee Id is: "+ empId);
        System.out.println("Employee Name is: "+ name);
        System.out.println("Employee Location is: "+ location);
    }
}
public class EmployeeTest {
    public static void main(String[] args)throws Exception{
        Employee emp = new Employee(115, "Raja", "Hyderabad");
        emp.empData();
        FileOutputStream fos = new FileOutputStream("E:\\Employee.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(emp);
        System.out.println("Object Serialized");
    }
}

실행 결과

Employee Id is: 115
Employee Name is: Raja
Employee Location is: Hyderabad
Object Serialized

정리

serialVersionUID는 Java 직렬화 메커니즘에서 객체의 버전 관리를 담당하는 중요한 요소입니다. 명시적으로 선언하면 클래스가 일부 수정되더라도 직렬화된 데이터와의 호환성을 개발자가 의도대로 제어할 수 있으며, 이를 통해 안정적인 객체 영속화와 분산 환경 간의 데이터 교환이 가능해집니다.