아이템 3 - readResolve 메서드는 기존에 존재하는 메서드인가요? #2
Closed this issue · 1 comments
kyum-q commented
#2 (아이템3 : private 생성자나 열거타입으로 싱글턴임을 보증하라)
싱글톤 직렬화을 위해서 readResolve 메서드를 정의하면 된다고 하였는데, readResolve 메서드는 기존에 있는 메서드를 Override한 건가요?
kyum-q commented
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()
가 호출되는 것을 확인할 수 있습니다 !
역직렬화 때 원하는 객체 반환하게 설정하는 법
- Serializable 인터페이스를 implements한다.
- 역직렬화 시, 반환할 객체가 지정되있으면 readResolve() 정의한다.
ObjectInputStream in = new ObjectInputStream(new FileInputStream("singleton.ser"));
// 해당 함수에서 readResolve() 가 객체 내 정의되어있으면 호출
Singleton deserializedInstance = (Singleton) in.readObject();
readResolve() 메서드는 Serializable 인터페이스와 밀접하게 연관 O
하지만, Serializable 인터페이스에 직접 선언된 메서드는 아니다 !
readResolve() 메서드는 Serializable 인터페이스에 포함되어 있는 것이 아니라, 자바 직렬화 메커니즘의 일부로써 동작하는 것입니다!
더 쉽게 말하면 자바 직렬화 매커니즘에는 존재하는 메서드이지만, 직렬화를 도와주는 Serializable 인터페이스에 있는 정의된 메서드는 아닙니다 !