Ad Block 한번만 꺼주시면 안될까요..?
게임 개발/게임 개발 이론

유니티) 싱글톤/싱글턴 디자인 패턴에 대해. (사용법, 사용이유, 장단점)

UniCoti(유니코티) 2023. 4. 3.

이번 글에선 싱글톤 패턴에 대하여 알아보도록 하겠다.

보통 부르는 용어가 싱글톤과 싱글턴이 있는데,

이 글에선 싱글톤으로 부르도록 하겠다.

 

이번 글에서는 크게 사용이유, 사용법, 장단점 3가지로 나눠서

설명해 보겠다. 사실 싱글톤은 절대강좌 유니티, 유니티 에센스 등

지금까지 읽은 몇몇 책에서도 나왔지만 완벽히 이해하지 못했었다.

그 마음이 걸려서 따로 찾아본 뒤, 충분히 이해하고 넘어가고자 글을 쓴다.

 

https://alpaca-code.tistory.com/59(유니티 에센스 리뷰)

 

유니티 에센스 리뷰

오늘은 레트로님의 유니티 에센스를 리뷰해 보겠다. 유니티 에센스라는 책은 기초부터 심화까지 모두 다루는데, 기초는 할만하다. 하지만 중수를 강좌대상으로 다루시는 만큼 완전 기초부터 시

alpaca-code.tistory.com

 

https://alpaca-code.tistory.com/31(절대강좌 유니티 리뷰)

 

절대강좌 유니티 책 리뷰

이번엔 절대강좌 유니티 라는 책의 후기를 남겨보도록 하겠다. 이 책을 사기전에 무슨 블로그의 유니티 책 추천 게시글을 보고 중수 수준이라고 되어 있길래 나도 나름 잘하는것 같아서 샀다.

alpaca-code.tistory.com


1. 사용이유

이 디자인 패턴은 주로 객체 지향 프로그래밍에서 쓰인다.

유니티는 객체 지향 프로그래밍이 잘 되어 있는 툴 중 하나이다.

컴포넌트가 존재하므로, 객체 지향이 굉장히 중요하기에 이러한 패턴이 사용된다.

 

https://alpaca-code.tistory.com/177(객체 지향 제5원칙)

 

기록용) 객체 지향 프로그래밍 제 5원칙.

이번글은 이미 많은 블로거가 이 원칙에 대하여 설명하고 있기도 하고, 경쟁력이 있을 정도로 길고, 높은 퀄리티로 적을 것도 아니라서 기록용으로 간단히 공부하는 용으로 적어보도록 하겠다

alpaca-code.tistory.com

 

싱글톤은 전역에서 접근이 가능하기에(Static) 원하는 스크립트에서

불러와서 마음대로 사용이 가능하다. 그래서 주로 게임의 전체를

관장하는 스크립트에 싱글톤을 사용한다. (ex Game manager)

 

또한 public으로 매 스크립트마다 연결하는 것은 메모리의 사용이

스크립트의 수의 배수만큼 증가하지만, 싱글톤을 사용하면

한 메모리의 할당만으로 원하는 스크립트의 기능을 가져올 수 있기에

자주 쓰는 스크립트의 경우 메모리의 사용을 크게 줄일 수 있다.

 

정리하자면 모든 스크립트가 써야 하는 변수나 기능을 관장하는

스크립트가 있다면, 접근의 편의와 메모리의 할당을 줄이기 위해

싱글톤 패턴을 사용한다.

 

참고로 static을 알아야 하기 때문에 따로 공부하고 오면 좋다.

https://alpaca-code.tistory.com/42(static 설명)

 

유니티 C# Static(정적) 사용법, 기능

유니티를 나름 오랫동안 해본 나에게도 static이란 기능은 써보지 않았었다. 왜냐하면 일단 보이는것만으로도 어려워보이고 무슨기능일지는 모르지만 그렇게 엄청난 도움이 되는 기능이 아닐것

alpaca-code.tistory.com


2. 사용법(유니티 기준)

싱글톤 패턴은 유니티뿐 아니라 모든 객체 지향 프로그래밍에서 쓰이지만

나(필자)의 블로그는 게임개발에 관한 글이 대부분이기에

유니티를 기준으로 코드를 짜보겠다.

먼저 코드를 소개하자면,

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SingleTon : MonoBehaviour
{
	public static SingleTon instance = null;
    
    Awake() {
	if(instance == null) { //생성 전이면
		instance = this; //생성
        } else if(instance != this) { //이미 생성되어 있으면
        	Destroy(this.gameObejct); //새로만든거 삭제
        }
        
        DontDestroyOnLoad(this.gameObject); //씬이 넘어가도 오브젝트 유지
    }
}

이런 식으로 코드를 짠다.

주석에 설명을 달아놓았으니 읽어보길 바란다.

코드로 인해서 게임 내에는 한 개의 클래스만 존재하게 된다.

 

그리고 static을 사용했기에 어느 스크립트든 SingleTon.instance.원하는 기능을

입력해주기만 하면, 접근자가 어떻든 값을 넣든 안 넣든 사용이 가능해진다.

 

좀 더 보편적으로 말하면 ClassName.instance.Method이다.


3. 장단점

솔직히 말하면 모든 기능이 그렇듯이 잘만 쓰면 단점은 없다.

검색을 하다 보면 단점을 말하는 글은 대부분 ~하면으로 시작하여 ~될 수 있다로 끝나는데,

이걸 다르게 해석하자면 전문가가 쓴다면 단점은 많지 않다는 말이 된다.

일단 제쳐두고, 장점부터 소개하겠다.

 

싱글톤의 장점은, 메모리 낭비가 현저히 줄어든다는 것이다.

게임을 만들다 보면 게임 매니저등 많은 스크립트가 필요로 하는

그런 게임 전체를 관장하는 스크립트들이 있는데,

이런 경우에 죄다 public으로 데려오는 경우 보다

싱글톤 패턴이 메모리를 몇 배 더 절약한다.

 

또한 싱글톤은 전역으로 접근이 가능하기에

가져올 필요 없이 그냥 어느 스크립트에서나

코드만 제대로 친다면 사용할 수 있다는 것도 장점이다.

 

단점이라고 하면, 전역변수가 가지는 모든 단점을 그대로 갖게 된다.

전역변수는 가장 마지막에 검색되게 때문에 조금 느릴 수 있으며,

유지보수가 조금 힘들어질 수 있다. 하지만 이 단점들을 커버하는 것이

디자인 패턴이며 그중에 싱글톤 패턴은 전역변수의 단점을 잘 커버해 준다.


여기까지 싱글톤 패턴에 대해 글을 써봤다.

싱글톤 패턴을 이해해야겠다고 마음은 들었지만

못하고 있었는데 이번기회로 공부하게 돼서 기분은 좋다

 

유니티 협력 링크(어필리에이트)


이상으로 도움이 되었길 바라며,

 

끝.

 

댓글

💲 추천 글