본문 바로가기
까망 동네/디자인 패턴

[디자인패턴] 싱글턴 패턴

by 까망 하르방 2023. 10. 14.
반응형

싱글턴(Singleton) 패턴이란?

• 단, 하나의 객체를 만들어서 사용 (단일 객체)

    → 한번 생성되고 프로그램 종료될 때까지 메모리에 상주

• 디자인 패턴(Design Pattern)에서 "생성 패턴"에 해당

• 다른 곳에서도 해당 인스턴스로 접근해서 사용

DB Connection Pool / Thread Pool / Logging과 같이
하나의 인스턴스로 여러 객체를 관리하는 형태에서 활용
 

💻 디자인 패턴(Design Pattern)이란?

👨‍💻 디자인 패턴(Design Pattern)이란? • SW 개발 방법 중에서도 구조적인 문제 해결에 목적을 둔다. • 알고리즘과 같이 특정 문제를 해결하는 Logic 형태보다는 특정 상황에 적용할 수 있는 방

 

 

zoosso.tistory.com

 

 

객체 생성은 new 키워드로 이루어진다.

생성된 객체는 각각 독립된 자원으로 서로 다른 메모리 영역을 차지하고 있다.

메모리는 유한한 자원으로 효율적인 관리가 필요하다.

싱글턴 패턴으로 접근을 제어하며 불필요한 메모리 낭비를 막을 수 있다.

• 캐시(Cache) 활용

• 하나의 자원에서 다수의 시스템 관리

• 공유 자원 관리

 

사실 하나의 인스턴스로 접근하여 데이터를 공유하는 것은

전역 변수도 가능하다.

전역 변수로 값을 공유하면 의도치 않게 데이터가 변질되는 등

다양한 문제가 발생할 수 있다.

싱글톤의 핵심 = "어떻게 하나의 객체만 생성하는가"

 

 

[예시 코드]

class Singleton {
public:
    // 정적 메서드를 사용하여 인스턴스에 접근
    static Singleton& getInstance() {
        // 인스턴스가 아직 생성되지 않았다면 생성
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return *instance;
    }

private:
    // 생성자를 private으로 선언하여 외부에서 인스턴스 생성 방지
    Singleton() {}
    static Singleton* instance;
};

// 정적 멤버 변수 초기화
Singleton* Singleton::instance = nullptr;

 

if문으로 객체 존재 여부를 확인하고,

  기존에 공유 되는 객체가 있다면 그대로 반환한다.

• instance라는 정적 포인터를 사용하여 유일한 인스턴스 저장

  (nullptr로 초기화)

 

 

[예시 코드] 싱글턴 인스턴스 확인

#include <iostream>

class Singleton {
public:
    static Singleton& getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return *instance;
    }
private:
    Singleton() {}
    static Singleton* instance;
};

Singleton* Singleton::instance = nullptr;

// -----------------------------------
void main() {
    Singleton& singleton1 = Singleton::getInstance();
    Singleton& singleton2 = Singleton::getInstance();

    // 인스턴스 비교
    if (&singleton1 == &singleton2) {
        std::cout << "두 객체는 동일한 인스턴스" << std::endl;
    }
    else {
        std::cout << "두 객체는 다른 인스턴스" << std::endl;
    }
}
// -----------------------------------

 

 

싱글턴 패턴 단점

강한 결합싱글턴 객체 역할이 커질수록 결합도가 높아지기에 설계 원칙에 위배되기도 한다.

멀티스레드 환경에서 주의

    → if (instance == nullptr)을 동시 접근시 문제될 수 있다.

테스트 어려움: 자원을 공유하고 있기에 테스트시 인스턴스 초기화 주의

• 객체 소멸 시점 주의

반응형

댓글