인간은 최고의 패턴 인식 머신이다.
- 새로운 문제 직면
- 과거에 겪었던 비슷한 문제를 찾음
- 그 문제를 해결했던 방법을 새 문제에 적용
이러한 방식에 따라 만들어진 것이 바로 디자인 패턴이다.
즉, 디자인 패턴은 프로그래밍에서의 패턴 도출 방식을 말한다.
구체적으로 갈수록 알고리즘 / 추상적으로 갈수록 디자인 패턴
- 알고리즘 : 정렬 알고리즘 등등
- 베스트 프랙티스 : instantiatie 많이 쓰지 마세요 (여기까지는 정답)
- 디자인 패턴 : ?? (여기는 선택의 영역)
다시 말해, 소프트웨어 설계에서 흔히 겪는 문제에 대한 해결책이지만 완성된 설계가 아닌 것이다.
이는, 알고리즘과 같이 곧바로 코드로 바뀌지 않으며, 어떤 문제를 다양한 환경에서 해결하는 법을 설명한 가이드 정도라고 생각하면 좋다.
장점
단점
프로세스에 오직 1개만 존재하는 클래스 인스턴스로 전역으로 접근 가능하다.
공통 리소스, 데이터 관리, 상태 공유 등에 사용한다.
private static GameManager instance;
public static GameManager Instance => instance;
private void Awake()
{
if(instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
if(instance != this) Destroy(gameObject);
}
}
유니티에서는 위와 같은 방식으로 싱글톤을 작성한다.
C#에서는 생성자도 private로 설정하여 오류를 방지하는데, 유니티에서는 이를 사용하지 않는 이유는 MonoBehaviour를 상속받기 때문이다.
위 클래스에서는 생성자를 제한하고 생명주기 함수를 통해 초기화를 하도록 하기 때문에 생성자에 대한 처리를 해 줄 필요가 없다.
자주 생성되고 삭제되는 객체를 미리 만들어 재사용하는 패턴을 말한다.
흔히 뱀서류 게임에서 수많은 몬스터들이 주위에서 나올 때 사용한다.
Instantiate와 Destroy를 사용하지 않는 이유는 다음과 같다.
Instantiate로 생성된 오브젝트는 힙 메모리에 할당되고 매우 많은 리소스를 잡아먹는다.
Destroy는 GC를 계속 불러오고 메모리 파편화가 많이 일어나 성능 저하를 불러온다.
객체 생성의 책임을 전담 객체에게 위임하는 패턴이다.
객체 생성 로직을 분리하여 유지보수와 확장성을 확보할 수 있다.
흔히, 우리가 몬스터 스포너를 활용하여 다양한 몬스터를 생성하는 것을 떠올리면 된다.
객체 간의 1:N 관계를 정의하는 패턴이다.
1에 해당하는 객체의 상태가 바뀌었을 때, 그에 의존하는 객체들에게 자동으로 알림이 간다.
요즘 유행하는 디자인 패턴이라고 하는데, 잘 사용해 본 적이 없어서 와닿지 않는다.
오늘은 디자인 패턴에 대해 알아 보았다.
사실 이름만 들어보고 뭐 인지는 제대로 몰랐는데, 튜터님의 강의를 듣고 나니 아직은 디자인 패턴을 응용할 단계는 아니라고 생각했다.
이 글을 보는 여러분들도 일단은 직관적으로 코드 짜서 기능을 완성하는데 중점을 둬보자!