Closed Limgayoung closed 3 months ago
어떤 경우에 지연 초기화가 이득인지 예시를 들어주실 수 있나요?
구체적인 예시를 들자면 이전 시간에 보았던 Singleton 객체를 생성할 때 지연 초기화가 이득일 수 있습니다.
public class SingletonExample {
private static class SingleInstanceHolder {
private static final SingletonExample INSTANCE = new SingletonExample();
}
public static SingletonExample getInstance() {
return SingleInstanceHolder.INSTANCE;
}
}
위 방식은 Singleton 객체를 생성하는 방식 중 Holder 라는 내부 클래스를 사용하는 방식입니다. 말씀하셨듯이 클래스 로딩이 지연 초기화 방식을 따르기 때문에 getInstance()가 호출될 때 Holder 클래스가 로딩되어 객체를 생성해 반환합니다. 이를 통해 SingletonExample 이라는 싱글톤 객체가 아에 생성이 안될 경우, 초기화 시간과 메모리 만큼의 이득을 가질 수 있게 됩니다.
그 이외에는 추상적이지만 어떤 객체가 매우 무거운 객체(Pattern과 같은)이지만 해당 객체 인스턴스의 사용 비율이 매우 낮거나 없을 수 있을 때 지연 초기화 방식이 큰 이득이 될 수 있는 상황이라고 할 수 있습니다.
자바에서는 클래스 로딩 자체가 지연 초기화 방식을 따르는데 그래서 성능이 크게 개선되지 않는 것인지도 궁금합니다.
그런 면도 있을 것으로 생각합니다. 하지만 다른 이유도 존재합니다.
지연 초기화 방식의 경우, 여러 상황에 따라 많은 문제가 발생할 수 있는 방식입니다. 이를 예방 또는 해결하기 위해 반드시 추가적으로 붙는 코드들이 생겨나게 되는데 아마 이런 추가적인 코드들로 인한 연산 때문에 성능 관점에서 드라마틱한 변화가 일어나지 않는 것으로 생각됩니다.
해당 주제의 경우 이후 아이템에서 더 자세하게 다루게 되는데 그때 다시 확인해 보는 것도 좋을 것 같습니다.
33페이지에서, 지연 초기화는 코드는 복잡해지고 성능이 크게 개선되지 않을 때가 많다고 했습니다. 어떤 경우에 지연 초기화가 이득인지 예시를 들어주실 수 있나요?
그리고 자바에서는 클래스 로딩 자체가 지연 초기화 방식을 따르는데 그래서 성능이 크게 개선되지 않는 것인지도 궁금합니다.