HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[아이템 6] 지연 초기화 성능이 궁금합니다. #9

Closed Limgayoung closed 3 months ago

Limgayoung commented 3 months ago

33페이지에서, 지연 초기화는 코드는 복잡해지고 성능이 크게 개선되지 않을 때가 많다고 했습니다. 어떤 경우에 지연 초기화가 이득인지 예시를 들어주실 수 있나요?

그리고 자바에서는 클래스 로딩 자체가 지연 초기화 방식을 따르는데 그래서 성능이 크게 개선되지 않는 것인지도 궁금합니다.

ForteEscape commented 3 months ago

Q1.

어떤 경우에 지연 초기화가 이득인지 예시를 들어주실 수 있나요?

A1.

구체적인 예시를 들자면 이전 시간에 보았던 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과 같은)이지만 해당 객체 인스턴스의 사용 비율이 매우 낮거나 없을 수 있을 때 지연 초기화 방식이 큰 이득이 될 수 있는 상황이라고 할 수 있습니다.


Q2.

자바에서는 클래스 로딩 자체가 지연 초기화 방식을 따르는데 그래서 성능이 크게 개선되지 않는 것인지도 궁금합니다.

A2.