OOP
[OOP] 싱글톤 패턴(Singleton Pattern)
2h1824
2025. 1. 16. 20:52
싱글톤 패턴
싱글톤 패턴을 따르는 클래스는 클래스에서 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 단 하나이고, 최초 생성 이후 호출된 생성자는 최초의 생성자가 생성한 객체를 반환
주로 프로그램 내에서 하나만 생성해 공유해야 하는 객체가 존재할 때 사용
싱글톤 패턴의 장점
- 메모리 사용 : 한개의 인스턴스만 고정 메모리 영역에 생성 ㅡ> 추후 해당 객체 접근 시 메모리 낭비 방지
- 속도 : 이미 생성된 인스턴스를 사용 ㅡ> 속도가 빠름
- 데이터 공유 : 전역으로 사용되는 인스턴스 ㅡ> 여러 클래스에서 데이터 공유 가능 ㅡ> But, 동시성 문제 유의
싱글톤 패턴 코드
싱글 캐릭터 게임
#include <iostream>
using namespace std;
class Character {
private:
static Character* instance; // 캐릭터 게임의 조작 가능한 1대의 비행기
int positionX; // 캐릭터의 X 좌표
int positionY; // 캐릭터의 Y 좌표
// private 생성자: 외부에서 객체 생성 금지
Character() : positionX(0), positionY(0) {
cout << "Character Created at (" << positionX << ", " << positionY << ")" << endl;
}
public:
// 복사 생성자와 대입 연산자를 삭제 -> 복사 방지
Character(const Character&) = delete;
Character& operator=(const Character&) = delete;
// 정적 메서드: 유일한 비행기 인스턴스를 반환
static Character* getInstance() {
if (instance == nullptr) { //없으면 만들어 반환
instance = new Character();
}
return instance;
}
// 비행기 위치 이동
void move(int deltaX, int deltaY) {
positionX += deltaX;
positionY += deltaY;
cout << "Character moved to (" << positionX << ", " << positionY << ")" << endl;
}
// 현재 위치 출력
void getPosition() const {
cout << "Character Position: (" << positionX << ", " << positionY << ")" << endl;
}
};
private에서 static으로 선언된 자기 자신을 가리키는 멤버 변수 선언 ㅡ> 생성자도 private에 만들어 외부에서 생성 불가능
ㅡ> 복사 생성자, 대입 연산자 삭제하여 복사 방지 ㅡ> getInstance()를 통해서만 접근 가능
// 정적 멤버 초기화
Character* Character::instance = nullptr;
// 사용 예시
int main() {
// 움직일 캐릭터 인스턴스 획득
Character* character = Character::getInstance();
character->move(10, 20); // 캐릭터 이동
character->getPosition(); //좌표 출력
// 출력: Character moved to (10, 20)
// 출력: Character Position : (10, 20)
// 동일한 인스턴스 획득
Character* sameCharacter = Character::getInstance();
sameCharacter->move(-5, 10); // 캐릭터 이동
sameCharacter->getPosition(); //위에서 조작한 좌표에서 이동한 값이 출력
// 출력: Character moved to (5, 30)
// 출력: Character Position : (5, 30)
return 0;
}
2개의 다른 포인터로 getInstance를 통해 인스턴스를 획득하여 조작 ㅡ> 둘다 같은 인스턴스 획득 ㅡ> 같은 인스턴스이므로 이동했던 좌표에서 변화 확인 가능
정리
싱글톤 패턴의 경우 싱글 게임에서의 플레이어 캐릭터처럼 단 하나만 존재해야 하는 경우에 사용하기 적절하며 이런 경우에 물리적으로 단 하나만 생성되도록 제한하여 이용할 시 접근 속도, 메모리 사용량, 데이터 공유 면에서 장점이 있다.
But, 동시성 문제가 발생할 수 있으니 이점에 유의하여 사용해야 한다.
참고자료
싱글톤(Singleton) 패턴이란?
싱글톤 패턴은 객체의 인스턴스를 한개만 생성되게 하는 패턴입니다.
velog.io