1. 싱글톤 패턴이란
특정 클래스의 인스턴스가 프로그램 내에서 단 하나만 존재하도록 보장하는 디자인 패턴.
같은 종류의 객체가 오직 하나만 생성되도록 제한하고, 이 객체에 대한 전역적인 접근점을 제공한다.
2. 싱글톤 패턴의 특징
2-1. 단일 인스턴스 : 클래스의 인스턴스가 프로그램 내에서 단 하나만 존재한다.
2-2. 전역 접근성 : 어디서든 이 인스턴스에 접근할 수 있는 방법을 제공한다.
2-3. 지연 초기화 : 대부분의 싱글톤은 처음 요청될 때만 초기화된다. (필요할 때만 생성)
3. 싱글톤 패턴의 구현 방법
싱글톤 패턴을 C++로 구현하기 위해서는 다음과 같은 핵심요소가 필요하다.
3-1. private 생성자 : 외부에서 new 연산자로 객체를 생성하지 못하도록 한다.
3-2. static 인스턴스 : 클래스 내부에 유일한 인스턴스를 static으로 선언한다.
3-3. static 접근 메소드 : 인스턴스에 접근할 수 있는 public 메소드 (보통 getInstance라는 이름을 사용)
3-4. static : 이 키워드는 메모리에 딱 한 번만 할당되는 특별한 변수를 만들 때 쓰는 키워드. 일반 변수와 다르게 프로그램이 실행되는 동안 계속 유지되며, 모든 객체가 이 변수를 공유해서 사용할 수 있다.
※ 기본적인 싱글톤 구현 예시
class Singleton {
private:
// private 생성자
Singleton() {
// 초기화 코드
}
// 복사 생성자와 할당 연산자를 private으로 선언하여 복제 방지
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
// 유일한 인스턴스를 저장할 static 변수
static Singleton* instance;
public:
// 인스턴스에 접근하는 static 메소드
static Singleton* getInstance() {
// 인스턴스가 없으면 생성 (지연 초기화)
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
// 싱글톤의 기능 메소드
void someFunction() {
// 기능 구현
}
// 소멸자
~Singleton() {
// 정리 코드
}
};
// static 멤버 변수 초기화
Singleton* Singleton::instance = nullptr;
4. 싱글톤 패턴의 장점
4-1. 인스턴스 하나 보장 : 클래스가 하나의 인스턴스만 갖는다는 것을 확실히 알 수 있음
4-2. 전역 접근점 : 인스턴스에 대한 전역 접근 지점을 얻을 수 있음
4-3. 초기화 지연 : 해당 객체는 처음 요청될 때만 초기화 됨 (리소스절약)
5. 싱글톤 패턴의 단점
5-1. 단일 책임 원칙 위반 : 객체 생성과 비즈니스 로직을 동시에 관리하므로 단일 책임 원칙을 위반함
5-2. 디자인 문제 은폐 : 잘못된 디자인을 가릴 수 있음
5-3. 멀티스레드 환경 문제 : 다중 스레드 환경에서 여러 스레드가 동시에 싱글톤 객체를 생성하지 않도록 추가 처리 필요
5-4. 테스트 어려움 : 단위 테스트가 어려울 수 있음
6. 싱글톤 패턴의 실제 사용 사례
6-1. 설정 관리자 : 애플리케이션 설정을 관리하는 클래스
6-2. 데이터베이스 연결 관리 : DB 연결을 한 번만 초기화하고 공유
6-3. 로깅 시스템 : 로그 파일을 여러 곳에서 동시에 쓰는 것을 관리
6-4. 하드웨어 인터페이스 접근 : 프린터나 그래픽 카드 같은 하드웨어
< 싱글톤 패턴 기초 연습문제 >
문제:
우리가 만들 프로그램에 "로그(Log) 기록기" 기능이 필요하다. 이 로그 기록기는 프로그램 전체에서 단 하나만 존재해야 하고, 어떤 곳에서든 로그 메시지를 기록할 수 있어야 한다.
요구사항:
Logger라는 이름의 클래스를 만든다.
이 Logger 클래스가 싱글톤 패턴을 따르도록 구현한다.
Logger 클래스 안에 logMessage(const std::string& message)라는 public 함수를 만들어서, 이 함수가 호출되면 전달받은 message를 콘솔에 출력하도록 한다. (예: [로그] 메시지 내용)
main 함수에서 Logger의 인스턴스를 두 번 얻어와서, 각각 다른 메시지를 기록해본다. 그리고 두 인스턴스가 정말 같은 인스턴스인지 확인하는 코드도 넣어준다.
'C++ 공부' 카테고리의 다른 글
| 스마트포인터와 벡터를 이용한 객체 생성 기초 (+ 이름 검색하기) (0) | 2025.09.08 |
|---|---|
| OOP_Project01_BankAccount(은행계좌관리프로그램 만들기) (0) | 2025.09.05 |
| 인터페이스와 추상클래스의 차이점 (0) | 2025.09.02 |
| C++언어 기초 - 8. SOLID 원칙 (2) | 2025.09.01 |
| C++언어 기초 - 7. STL의 개념 (1) | 2025.08.26 |