OOP

[OOP] 싱글톤 패턴(Singleton Pattern)

2h1824 2025. 1. 16. 20:52

싱글톤 패턴

싱글톤 패턴을 따르는 클래스는 클래스에서 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 단 하나이고, 최초 생성 이후 호출된 생성자는 최초의 생성자가 생성한 객체를 반환

주로 프로그램 내에서 하나만 생성해 공유해야 하는 객체가 존재할 때 사용

싱글톤 패턴의 장점

  1. 메모리 사용 : 한개의 인스턴스만 고정 메모리 영역에 생성 ㅡ> 추후 해당 객체 접근 시 메모리 낭비 방지
  2. 속도 : 이미 생성된 인스턴스를 사용 ㅡ>  속도가 빠름
  3. 데이터 공유 : 전역으로 사용되는 인스턴스 ㅡ> 여러 클래스에서 데이터 공유 가능 ㅡ> 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, 동시성 문제가 발생할 수 있으니 이점에 유의하여 사용해야 한다.


참고자료

https://velog.io/@seongwon97/%EC%8B%B1%EA%B8%80%ED%86%A4Singleton-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80#:~:text=%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EB%94%94%EC%9E%90%EC%9D%B8%20%ED%8C%A8%ED%84%B4%EC%97%90%EC%84%9C%20%EC%8B%B1%EA%B8%80%ED%84%B4,%EC%9D%84%20%EC%8B%B1%EA%B8%80%ED%84%B4%20%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9D%BC%EA%B3%A0%20%ED%95%9C%EB%8B%A4.

 

싱글톤(Singleton) 패턴이란?

싱글톤 패턴은 객체의 인스턴스를 한개만 생성되게 하는 패턴입니다.

velog.io