디자인 패턴에서 가장 간단한 패턴이다.
싱글톤 패턴을 사용하는 객체는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하도록 설계해야 한다.
즉, 어떤 상황에서든 반드시 하나만의 인스턴스(객체)만이 존재한다.
싱글톤 패턴 예시
이 예시가 가장 직관적일 것 같다.(100% 싱글톤과 동일한 의미라는 것은 아니다.)

싱글톤 패턴 == 구글 스프레드 시트
구글 스프레드 시트는 여러 사용자가 동시에 하나의 문서를 보고, 편집하고, 공유할 수 있는 방식이다. 즉 하나의 문서(인스턴스)만 생성하고, 여러 사용자가 하나의 문서에 접근한다.
만약 100명이 구글 스프레드 시트를 사용하지 않고, 일반 엑셀로 일정을 정리한다고 생각해보자.(즉, 싱글톤 패턴을 사용하지 않는 것이다.) 사람들은 각각 엑셀로 같은 내용의 파일(인스턴스)을 로컬에 저장하고, 일정에 변경이 생길 때마다 100명의 사람들에게 메일을 보내 업데이트된 파일을 공유하는 매우 불편하고 실수도 많이 생기는 일을(그것도 자주!) 해야 할 것이다.
하지만 구글 스프레드 시트를 사용하면,(싱글톤 패턴을 사용하면) 하나의 문서에 접근하므로, 항상 모든 사람이 같은 내용을 공유하고, 쉽게 업데이트 할 수 있다.
어떻게 적용하나
디자인 패턴이라는 것은 외우는 것이 아니라 실제로 사용하기 위해 배우는 것이라고 생각한다.
나는 개인적으로 “하나만 있는게 좋은 객체” 또는 “여러개 있으면 불편해지는 객체” 라고 생각되면 싱글톤 패턴을 떠올린다.
“반드시 하나만 있어야 하는 객체” 라고 생각하면 쉽게 떠올리기 어렵지만, “하나만 있는게 좋은 객체” 또는 “여러개 있으면 불편해지는 객체” 일때 사용하는 패턴으로 생각하는게 개인적으로 더 떠올리기 쉽다.
이러한 싱글톤 패턴이 필요한 경우를 생각해보자.
싱글톤 패턴 예제
- 공유 자원: 시스템 내에서 공유되는 자원(예: 데이터베이스 연결, 파일 시스템 등)에서 싱글톤 패턴을 사용하여 자원에 대한 중복 접근을 방지하고 자원을 효율적으로 관리할 수 있다.
- 설정 관리: 애플리케이션의 설정 정보와 같이 여러 부분에서 공통적으로 사용되는 정보를 페이지마다 관리하면 불편할 것이다. 싱글톤 패턴을 사용하면 설정 정보가 변경할때 싱글톤 인스턴스만 업데이트하여 모든 클라이언트에서 변경된 정보를 사용할 수 있다.
- 로그 기록: 로그는 시스템 전체에 걸쳐서 하나의 로그 파일로 관리하는 것이 일반적이다. 싱글톤 패턴을 사용하면 로그 기록기 인스턴스를 하나만 생성하여 일관적으로 로그를 관리할 수 있다.
- 캐시 관리: 데이터 캐시와 같이 상태 정보를 메모리에 저장하고 여러 클라이언트가 이를 공유해야 할 때 싱글톤을 사용할 수 있다.
- 하드웨어 인터페이스 관리: 하드웨어 리소스에 대한 접근을 관리해야 할 때(예: 프린터 포트나 그래픽 카드 설정) 싱글톤 패턴을 통해 하드웨어 하나당 하나의 인스턴스만 있도록 하면, 리소스 접근을 일관되고 안전하게 관리할 수 있다.
마치며
가장 간단한 디자인 패턴인 싱글톤 패턴을 정리해 보았다.
C++의 unique_ptr, shared_ptr 와 비슷한 필요에서 만들어진 패턴인 것 같다. 시간되면 unique_ptr도 알아보자.(아래 링크는 씹어먹는 C++ 강좌의 unique_ptr 내용이다.)
만약 글 내용이 마음에 든다면 아래 웃는 얼굴을 클릭해주면 고마울 것 같다.