• 카테고리

    질문 & 답변
  • 세부 분야

    취업 · 이직

  • 해결 여부

    해결됨

5. 정적 멤버와 Lazy Holder(중첩 클래스) 질문

24.03.26 12:16 작성 24.03.26 12:17 수정 조회수 70

0


DEEP DIVE : 싱글톤 패턴을 구현하는 7가지 방법 #2 ★★☆

챕터에서 5. 정적 멤버와 Lazy Holder(중첩 클래스)를 이용한 방법으로 아래 코드를 설명해주셨는데요

public class Singleton {
    private static class singleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return singleInstanceHolder.INSTANCE;
    }
}

 

생성자를 private으로 막지 않으면 싱글턴 인스턴스를 만든 이유가 없지 않나요?

싱글턴이 필요하지 않을 때는 생성자 호출로 생성한 후, 더 이상 쓰지 않을 때 GC가 회수하게 하다, 싱글턴이 필요한 순간에 생성하는 건가요?

 

public class Main {
    public static void main(String[] args) {
        Singleton instance = new Singleton(); // 싱글턴이 필요하지 않으면 직접 호출하기
        Singleton singleton1 = Singleton.getInstance(); // 싱글턴이 필요한 순간에 싱글턴 객체 생성하기?
    }
}

답변 1

답변을 작성해보세요.

0

안녕하세요 안농님 ㅎㅎ

코드를 private으로 수정해라 라는 말씀처럼 들리는데요.

 

class Singleton {
    private static class singleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return singleInstanceHolder.INSTANCE;
    }
}

혹시 이 코드가 어떻게 되어야 한다고 생각하시나요?

 

감사합니다.

public class Singleton {
    private Singleton() {
    }
    private static class singleInstanceHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return singleInstanceHolder.INSTANCE;
    }
}


생성자를 private으로 막으면 Singleton 으로만 동작하도록 강제하여, 원래 코드 의도에 더 부합할 것 같습니다.

아.. 이해했습니다.

안농님이 짠 코드가 더 좋네요.

그 이유는 다음과 같습니다.

private 생성자를 사용함으로써 클래스의 인스턴스가 클래스 외부에서 임의로 생성되는 것을 방지하며, 싱글턴 인스턴스에 접근하기 위해서는 getInstance() 메서드를 강제하게 하니까요.


해당부분은 빠른 시일내로 강의내에 반영하도록 하겠습니다.

개선점을 말씀해주셔서 정말 감사드립니다.

 

해당 부분 교안내에 수정완료했습니다.

최신 교안 다운 받으시면 수정완료된 코드 받아보실 수 있으십니다.

 

감사합니다.