inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

싱글톤 패턴 구현방법

49

이지훈

작성한 질문수 7

0

안녕하세요 큰돌님!


싱글톤 패턴 구현방법 중 3번째 방법에 대해서 (11:38 내용 중) 궁금한 점이 있습니다.


애초에 싱글톤 인스턴스가 런타임에 꼭 필요하기 때문에 패턴을 구현해 놨을거고, 생성한 순간부턴 메모리에 계속 남아있게 될텐데, 런타임이 아니라 클래스 로딩시점에 미리 생성해 두는게 자원낭비라는 단점으로 보는게 맞을까? 하는 의문이 들어서 질문드립니다!

면접 운영체제 기술면접

답변 2

0

큰돌

안녕하세요 지훈님 ㅎㅎ

런타임이 아니라 클래스 로딩시점에 미리 생성해 두는게 자원낭비

-> 보통 싱글턴은 앱 실행시 반드시 사용되는 객체의 경우 싱글턴을 걸기 때문에 자원낭비라 볼 수 없습니다.





또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

이지훈

제 질문이 조금 다르게 전달된 것 같아 다시 질문드립니다!

24강 11분 38초 부근에서 3번째 구현 방법을 설명하실 때, 클래스 로딩 시점에 미리 생성되면 '어떤 로직에서는 싱글톤 인스턴스가 필요 없는 경우도 발생하거든요'라며 이를 '불필요한 자원 낭비'라고 단점으로 짚어주셨는데요.

제 의문은 이렇습니다. 어차피 싱글톤 인스턴스는 런타임 도중에 최소한 한 번 이상은 쓰일 일이 있으니까 만들었을 거고, 한 번이라도 생성되는 순간부터는 프로그램이 끝날 때까지 메모리에 계속 상주하게 될 텐데요.

그렇다면

  1. 런타임에 호출되어 중간에 생성되나,

  2. 아예 클래스 로딩 시점에 미리 생성되나,

결국 프로그램 실행 중에 해당 싱글톤이 메모리를 차지하고 있게 된다는 결과 자체는 똑같지 않나요? '인스턴스가 아예 필요 없는 로직(경로)'이 존재한다는 이유만으로, 굳이 클래스 로딩 시점에 미리 만들어지는 걸 두고 '자원 낭비'라고 표현하는 이유가 잘 이해가 가지 않습니다.

런타임 중에 어차피 한 번은 올라가서 상주할 텐데, 미리 올라가 있는 것과 나중에 올라가는 것의 메모리 관점에서의 차이가 무엇인지 궁금합니다!"

1

큰돌

안녕하세요 지훈님 ㅎㅎ

해당 지적해주신 부분, 절반은 맞는 말씀입니다.


1) "어차피 한 번은 쓰인다"가 전제라면 메모리 총량 차이는 거의 없습니다

말씀하신 대로 그 싱글턴이 실행 중 반드시 한 번은 쓰인다면, 미리 만들어지든 첫 호출 때 만들어지든 최종적으로 힙에 상주하는 건 동일합니다. 이 부분은 정확히 보셨습니다.


2) 다만 그 전제가 안 깨질 때만 성립합니다

강의에서 말씀드린 '자원 낭비'는 이 전제가 깨지는 경우를 가리킵니다.

- 실행 경로에 따라 한 번도 안 쓰이는 싱글턴이 실무엔 꽤 있습니다. ExcelExportManager, PdfRenderer, 특정 배치 전용 커넥션 풀 같은 것들은 해당 기능을 안 타는 실행에서는 끝까지 쓰이지 않습니다. 이 경우는 '생성 → 끝까지 상주 → 한 번도 사용 안 됨'이라 순수 낭비입니다.

- 프로세스 수명이 짧을수록 체감이 큽니다. CLI 툴, 람다/서버리스, 테스트 실행처럼 수 초짜리 프로세스에서는 안 쓰는 객체의 초기화 비용 비중이 커집니다.


3) 그리고 비용이 메모리만 있는 게 아닙니다

싱글턴 생성자는 대체로 무겁습니다. DB 커넥션 풀 생성, 소켓 오픈, 설정 파일 파싱, 캐시 워밍 같은 것들이죠.

- 시작 지연: 이 비용이 전부 앞당겨져 지불되어 콜드 스타트에 직결됩니다.

- 점유 기간: 메모리는 '얼마나'뿐 아니라 '얼마나 오래'도 비용입니다. 0초에 올라가 old gen으로 승격되는 것과 50초 뒤에 올라가는 것은 다릅니다.

- 예외 타이밍: static 초기화 중 예외가 나면 ExceptionInInitializerError로 감싸져 정상적인 예외 흐름으로 다루기 까다롭고, 이후 해당 클래스 접근은 NoClassDefFoundError가 납니다. 안 쓰는 기능 때문에 앱 전체가 못 뜨는 상황이 생깁니다.

- 초기화 순서: 아직 준비되지 않은 설정값에 의존하면 순서 문제가 생깁니다.

정리하면

'자원 낭비' = '메모리 총량이 늘어난다'가 아니라, '쓰일지 안 쓰일지 모르는 객체의 생성 비용을 필요 시점보다 먼저 앞당겨 지불한다'로 이해하시면 정확할거 같습니다.



좋은 질문 감사합니다. 또 궁금한 점 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 이지훈님!

싱글톤 패턴에서의 자원 낭비 문제에 대해 좋은 질문을 해주셨습니다. 싱글톤 패턴을 사용하는 이유는 결국 애플리케이션 내에서 인스턴스가 하나만 필요하기 때문입니다. 하지만 싱글톤 인스턴스를 미리 생성해놓는 방식이 자원 낭비로 간주될 수 있는 이유는 클래스가 실제로 사용되지 않더라도 객체가 메모리에 상주하게 되기 때문입니다.

클래스 로딩 시점과 미리 생성

  • 클래스 로딩 시점에 미리 싱글톤 인스턴스를 생성한다는 것은 애플리케이션 내에서 해당 클래스가 사용되지 않더라도 인스턴스를 생성해 놓는다는 의미가 됩니다. 이는 사실상 해당 클래스의 존재 여부와 상관없이 무조건적으로 메모리가 할당된다는 점에서 자원 낭비로 볼 수 있습니다.
  • 실제로 애플리케이션을 실행하면서 사용되지 않는다면, 불필요한 메모리 사용으로 이어질 수 있습니다. 특히, 리소스를 많이 소비하는 객체라면 더욱 그렇습니다.

이러한 이유로 필요에 따라 객체를 생성하도록 설계하는 것은 자원의 효율적인 사용 측면에서 유리할 수 있습니다. 게다가, 이러한 미리 생성된 객체가 필요 없을 경우, 나중에 가비지 컬렉터에 의해 제거되는 것도 아닙니다.

아래 유사한 게시물을 참고하시어 더 깊이 있는 이해를 도와드리겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

디자인패턴 질문

0

27

2

팩토리 패턴

0

44

2

라이브러리 프레임워크 차이 질문

0

51

1

프로젝트 질문 드립니다!

0

41

2

추상화 질문

0

33

2

직렬화 역직렬화 질문 드립니다!

0

50

2

안녕하세요 큰돌님!

0

71

2

REST API (Self-descriptive messages)

0

64

1

시스템 엔지니어 관련 질문입니다.

0

118

2

오버라이딩 관련하여 질문드립니다.

0

102

2

교착상태의 4가지 필요조건이 필요충분조건이 아닌 이유

0

132

1

렌더 트리, 렌더 레이어와 그래픽 레이어

0

82

2

로컬스토리지, 세션스토리지, 쿠키의 공통점

0

86

1

IPv4가 IPv6보다 빠른 경우

0

171

2

UDP가 전송계층의 역할을 못하는 건 아닌지

0

81

1

Path MTU 발견하였음에도 패킷 분할이 필요한 이유?

0

95

2

교재의 LFU 알고리즘에서 6번이 왜 히트인가요?

0

102

2

페이지 교체 알고리즘? 프레임 교체 알고리즘?

0

113

2

Static 키워드가 메모리에 올라가는 시점

0

103

2

헤더 압축부분 질문드립니다

0

105

2

공유 캐시 관련 질문 드립니다.

0

79

2

컨텍스트는 context와 contextual information으로 나눠진다는게 무슨뜻인가요?

0

260

1

회선과 대역폭의 관계

0

102

2

44강 질문

0

142

2