Unity/학습

유니티)싱글톤 패턴

wh011202 2025. 1. 4. 17:20

디자인 패턴중에서 싱글톤 패턴이란게 있다.

 

이 클래스는 생성자가 여러차례 호출 되더라도 실제로 생성되는 객체는 하나이고 , 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. => 본인객체 호출될때 값이 주소에 null이 아닌경우 return this 해도 되는듯? 하다.

 

싱글톤(Singleton) 패턴은 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴이다. 

이 패턴은 인스턴스가 프로그램 전체에서 동일한 자원을 공유하도록 하는 데 유용하다. 주로 설정 파일, 프린터 스풀러, 키보드 리더와 같은 리소스를 전역적으로 관리할 때 사용된다. 

 

 

아래는 보편적인 위키에서 긁어온 유니티 싱글턴의 기본세팅이다.

class Singleton : MonoBehaviour
{
    public static Singleton Instance { get; private set; }

    private void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(this.gameObject);
        }
        else
        {
            Instance = this;
        }
    }
}

 

 

싱글톤 패턴은 다음과 같은 주요 특징을 가진다.

  • 전역 접근성 : 싱글톤 인스턴스는 프로그램 어디서든 접근할 수 있다.
  • 유일한 인스턴스 보장 : 클래스의 인스턴스가 하나뿐임을 보장하여, 불필요한 메모리 낭비와 자원 중복을 방지한다.
  • 생성자 접근 제한 : 싱글톤 클래스의 생성자는 private으로 선언되어 외부에서 새로운 인스턴스를 생성하지 못하도록 제한된다.

 

 

구현 방법

  • 사전 초기화(Eager Initialization) : 클래스가 로드될 때 즉시 인스턴스를 생성하는 방식이다. 이 방식은 멀티스레드 환경에서 안전하며, 이중 객체 생성 문제를 방지할 수있다. 다만, 인스턴스를 실제로 사용하지 않더라도 메모리가 할당되는 단점이 있다. 
  • 사후 초기화(Laze Initialization) :  필요한 시점에 인스턴스를 생성하는 방식이다. 이 방법은 메모리와 자원을 효율적으로 사용 할수 있지만, 멀티스레드 환경에서는 이중 객체 샛엉 문제가 발생할 수 있어 주의가 필요하다.
  • 오남용 문제 : 싱글톤 패턴은 전역 변수처럼 남용되는 경우가 많아 주의가 필요하다. 싱글톤을 데이터 저장용으로 사용하거나 , 전역변수를 대체하는 용도로 사용하는 것은 객체 지향 프로그래밍 원칙을 위반하는 잘못된 설계이다.  싱글톤 패턴은 전역 상태를 관리하는 방식으로 사용하는 것이 아니라, 클래스의 인스턴스가 하나만 존재해야 하는 논리적인 이유가 있을 때만 사용해야 한다. 
    • 예시
      • 상태가 없는 클래스 : 속성이 없거나 있어도 모두 읽기 전용인경우.
      • 인스턴스 메소드가 필요한경우 : 정적 메소드가 아닌 인스턴스 메소드가 필요한경우.
  • 실제 사용 사례 : 
    • 추상팩토리(Abstract Factory): 대부분의 경우 콘크리트 팩토리 클래스는 하나의 인스턴스만 필요하다.
    • 빌더(Builder) : 내부 빌더 클래스에서 사용된다.
    • 프로토타입(Prototype) : 콘크리트 프로토타입 클래스에서 사용된다.
    • 파사드(Facade): 파사드 클래스가 상태를 가지지 않는 경우 사용될수 있다