싱글톤을 정적 멤버로 생성하는 경우 질문있습니다.
싱글톤을 정적멤버로 생성하는 경우 싱글톤 인스턴스가 필요없는 경우도 무조건 싱글톤 클래스를 호출해 인스턴스를 만들어서 자원낭비가 일어날 수 있다고 배웠습니다
그런데 제가 좀 더 알아보니 클래스 로딩은 클래스를 실제로 사용하기 전까지는 로딩을 하지 않는다고 하더라고요
대신 정적 멤버 중 하나만 불러오더라도 다 불러와진다는 것을 알게됐습니다.
실제로 싱글톤 클래스를 사용하기 전까지 초기화가 되지 않는다는 점과 싱글톤 클래스를 사용하면 싱글톤을 생성하기 위해 사용할 확률이 높기 때문에 자원낭비가 되지 않을 것 같다고 생각했습니다
이 부분이 좀 헤갈리는 것 같아서 질문올립니다!
回答 2
0
안녕하세요 ㅎㅎ
제 강의를 보시면 싱글톤개념 + 이를 구현하는 패턴 7가지를 알려주는데요.
이 중에서 어떤 부분을 보시고 이런질문을 하시는지 알 수 있을까요?
아니면 그냥 "싱글톤을 정적멤버로 생성하는 경우 싱글톤 인스턴스가 필요없는 경우도 무조건 싱글톤 클래스를 호출해 인스턴스를 만들어서 자원낭비가 일어나는가? "에 대한 질문이실까요?
감사합니다.
0
네! 선생님 강의에서 정적멤버로 싱글톤을 생성하는 방법봤습니다.
강의에서 클래스 로딩때 모든 클래스가 로딩된다고 하셔서 클래스 로딩에 대해 알아봤습니다
그런데 클래스를 실제로 호출하지 않는다면 사용할때까지는 최대한 로딩을 미룬다고 하더라고요
class Singleton {
private static Singleton instance;
public static int call = checkClassLoading();
private Singleton() {}
static {
try {
instance = new Singleton();
System.out.println("초기화됨");
} catch (Exception e) {
throw new RuntimeException("싱글톤 객체 생성 오류");
}
}
public static Singleton getInstance() {
return instance;
}
public static int checkClassLoading() {
System.out.println("Singleton.checkClassLoading");
return 1;
}
}그래서 이렇게 만들어두고 외부 Main클래스에서 실행해봤는데 아무것도 뜨지 않지만 Singleton.getInstance() 를 하면 아래와 같은 결과가 나오더라구요
결과
Singleton.checkClassLoading
초기화됨
그래서 질문은 "싱글톤을 정적멤버로 만들어도 사용하기 전까지는 메모리에 올라가지 않는 것 같은데 자원 낭비라고 볼 수 있는지" 입니다.
2
안녕하세요 ㅎㅎ
강의에서 클래스 로딩때 모든 클래스가 로딩된다고 하셔서 클래스 로딩에 대해 알아봤습니다
-> 음 일단 다음의 강의를 보시면
"강의에서 클래스 로딩때 모든 클래스가 로딩된다"의 문맥을 보시면 해당 문맥에서의 "코드는 싱글톤클래스를 참조하는 상황"이기 때문에 참조가 되면 클래스가 로드된다. 로 이해할 수 있습니다.
다만, 교안내 설명 부분은 착오가 올 수 있는 표현이기 때문에 해당 부분은 다음과 같이 수정하도록 하겠습니다.
정적(static) 멤버로 싱글톤을 만드는 방법입니다. Singleton 클래스가 참조될 때 로딩과 초기화가 이루어는데 이 때 메모리 상에서 한 번만 생성되고 프로그램 종료 시까지 유지됩니다.
...
하지만 이 경우 클래스가 로드되었다 하더라도 정적멤버의 경우 당장 객체를 사용하지 않더라도 메모리에 적재되기 때문에 자원 낭비가 발생할 수 있습니다.
싱글톤을 정적멤버로 만들어도 사용하기 전까지는 메모리에 올라가지 않는 것 같은데 자원 낭비라고 볼 수 있는지
-> 싱글턴클래스 로딩 이후 해당 인스턴스를 사용하지 않아도 초기화가 되어서 자원이 낭비되는 경우가 있습니다. 이부분은 순수 java 코드를 기반으로 간단하게 설명할 수 있지만(class.forName 등) ... 좀 더 실용적인 spring기반의 예제를 만들어서 다시 답변드리겠습니다.ㅎㅎ
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 3831568님께서 질문해주신 내용은 싱글톤 패턴에서의 정적 멤버 초기화와 클래스 로딩에 관한 내용으로 이해했습니다.
싱글톤 패턴에서 정적 멤버를 사용하면 클래스가 처음 로드될 때 초기화가 이루어진다는 점에서 자원 낭비가 우려될 수 있습니다. 하지만 클래스 로딩은 실제로 그 클래스의 필드나 메서드에 접근하거나 클래스를 직접 사용할 때까지 지연됩니다. 이로 인해 실제로 싱글톤 객체를 필요로 하기 전까지 초기화가 지연될 수 있기 때문에 불필요한 자원 낭비를 피할 수 있습니다.
클래스 로딩과 초기화
- 클래스 로딩: JVM은 클래스를 사용할 때 로딩합니다. 즉, 클래스 자체가 사용되지 않는다면 로딩되지 않습니다.
- 정적 멤버 초기화: 클래스 로딩 후 그 클래스의 정적 멤버들은 초기화됩니다. 하지만 이는 해당 클래스가 실제로 사용되기 전까지 이루어지지 않습니다.
따라서, 정적 멤버로 싱글톤을 구현하더라도 클래스가 사용되지 않는다면 초기화되지 않기 때문에 자원 낭비를 큰 걱정 없이 사용할 수 있습니다.
이와 관련한 질문이나 더 깊이 있는 내용을 알고 싶으시다면, Lazy Holder 패턴에서의 정적 초기화 관련 게시물을 참고하시면 더욱 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
Model이 비즈니스 로직을 담당하나요?
0
105
2
C++ 파일 구조 질문
0
128
1
Vue.js 3.0 옵저버 패턴 실습 코드 실행 방법
0
124
2
굳이 팩토리 메소드 패턴을 쓰는 이유가 뭔가요??
0
809
1
그토록 기다리던 강의!
1
337
1
스프링에서 디자인패턴 적용
1
916
1

