인프런 커뮤니티 질문&답변

안농은만나면안농님의 프로필 이미지
안농은만나면안농

작성한 질문수

CS 지식의 정석 | 디자인패턴 네트워크 운영체제 데이터베이스 자료구조

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

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

해결된 질문

작성

·

138

·

수정됨

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() 메서드를 강제하게 하니까요.


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

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

 

큰돌님의 프로필 이미지
큰돌
지식공유자

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

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

 

감사합니다.

안농은만나면안농님의 프로필 이미지
안농은만나면안농

작성한 질문수

질문하기