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