woowacourse-study/2024-effective-java

아이템 3 - readResolve 메서드는 기존에 존재하는 메서드인가요? #2

Closed this issue · 1 comments

#2 (아이템3 : private 생성자나 열거타입으로 싱글턴임을 보증하라)

싱글톤 직렬화을 위해서 readResolve 메서드를 정의하면 된다고 하였는데, readResolve 메서드는 기존에 있는 메서드를 Override한 건가요?

import java.io.*;

class Singleton implements Serializable {
    private static final long serialVersionUID = 1L;
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }

    // readResolve 메서드 구현
    protected Object readResolve() {
        System.out.println("readResolve() 메서드가 호출되었습니다.");
        return INSTANCE;
    }

    public static void main(String[] args) {
        try {
            // 객체를 직렬화
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("singleton.ser"));
            out.writeObject(INSTANCE);
            out.close();

            // 객체를 역직렬화
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("singleton.ser"));
            Singleton deserializedInstance = (Singleton) in.readObject();
            in.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

readResolve를 사용하는 예제를 찾아보니 위 예제가 나왔어요!

실제로 실행해보니 ObjectInputStream 객체의 readObject()이 호출되면 해당 객체의 readResolve()가 호출되는 것을 확인할 수 있습니다 !

역직렬화 때 원하는 객체 반환하게 설정하는 법

  1. Serializable 인터페이스를 implements한다.
  2. 역직렬화 시, 반환할 객체가 지정되있으면 readResolve() 정의한다.
ObjectInputStream in = new ObjectInputStream(new FileInputStream("singleton.ser"));

// 해당 함수에서 readResolve() 가 객체 내 정의되어있으면 호출
Singleton deserializedInstance = (Singleton) in.readObject();

readResolve() 메서드는 Serializable 인터페이스와 밀접하게 연관 O
하지만, Serializable 인터페이스에 직접 선언된 메서드는 아니다 !

readResolve() 메서드는 Serializable 인터페이스에 포함되어 있는 것이 아니라, 자바 직렬화 메커니즘의 일부로써 동작하는 것입니다!

더 쉽게 말하면 자바 직렬화 매커니즘에는 존재하는 메서드이지만, 직렬화를 도와주는 Serializable 인터페이스에 있는 정의된 메서드는 아닙니다 !