[UNITY]알쓸유잡 : 프로그래밍💻디자인패턴 4부

 

 

1. 🎮 새로운 디자인 패턴과 코로나 주의사항

 
  • 이번 방송에서는 게임 개발에 활용할 수 있는 여러 가지 프로그래밍 디자인 패턴, 특히 MVVM, 스트레티지, 플라이웨이트, 더티 플래그 패턴을 다룬다.

  • 8월에 출시된 새로운 개정판에서는 기존의 프로그래밍 패턴 외에도 추가된 네 가지 패턴이 포함되어 있으며, 샘플도 보강되었다.

  • 방송 중에는 코로나 관련 건강 주의사항이 언급되었으며, 바이러스에 대한 경각심을 갖고 주의할 필요가 있다.

1.1. 8월 프로그래밍 디자인 패턴 시리즈
  • 8월에 다시 찾아온 프로그래밍 디자인 패턴 시리즈는 게임 개발에 적용 가능한 여러 가지 내용을 다루고 있다.

  • 원래 2부작으로 계획했으나, 본사에서 많은 작업을 하여 개정판이 출시되었다고 한다.

  • 개정판의 출시 타이밍이 적절하다는 반응을 보이고 있다.

1.2. 새로운 프로그래밍 패턴과 자료 안내
  • 새로 출시된 프로그래밍 패턴 2부 개정판의 소식이 7월 유니티 라이브에서 언급되었으며, 본방송에서 링크를 통해 제공될 예정이다.

  • 오늘 방송에서는 MVVM 패턴, 스트래티지 패턴, 플라이웨이트 패턴, 그리고 더티 플래그 패턴의 네 가지 패턴을 다룬다.

  • 방송 시간은 두 시간으로 예상되며, 다양한 자료와 데모가 포함된 이북도 제공될 예정이다.

  • 제공되는 자료들은 모두 무료로 이용 가능하며, 유니티 관련 정보를 쉽게 접할 수 있는 장점이 있다.

  • 시청자들은 유니티 코리아 채널과 네이버 유니티 허브 카페를 통해 신규 소식을 지속적으로 받아볼 수 있다.

1.3. ️ 게임 프로그래밍 디자인 패턴 개정판 소개
  • 이번 시간에는 게임 프로그래밍 패턴의 네 번째 시간으로, MVC, MVP, MVVM 패턴을 간략히 다룰 예정이다.

  • 모델-뷰-컨트롤러 패턴 이후에 MVVM 패턴과 스트레티지, 플라이웨이트, 더티 플래그 패턴이 개정판에 새로 추가되었다.

  • 개정판은 기존 이북의 내용을 바탕으로 있으며, 한글화 작업이 진행 중이다.

  • 내용은 기존과 크게 다르지 않지만, 샘플이 보강되고 설명이 추가되어 갱신되었다.

1.4. MVVM 및 추가 디자인 패턴 설명
  • MVVM 패턴은 모델, 뷰, 뷰모델로 구성되며, 기존의 MVP 패턴을 대체한다.

  • 2판부터 MVVM, 전략 패턴, 플라이웨이트, 더러운 플래그네 가지 패턴이 추가되었다.

  • 이 추가된 내용을 중심으로 설명할 예정이다.

  • 샘플도 이전보다 많이 보강되어 있어 내용의 이해를 돕는다.

1.5. 에셋 스토어에서의 무료 다운로드와 디자인 패턴 샘플 설명
  • 기존에는 샘플이 기업 블로그를 통해 배포되었으나, 이제는 에셋 스토어에서 다운로드할 수 있다.

  • 이 앱은 무료로 제공되며, 사용자는 링크를 통해 에셋 스토어에 접속할 수 있다.

  • 디자인 원칙 중 하나인 단일 책임 원칙에 대한 설명이 잘 정리된 샘플로 제공되고 있다.

  • 리팩토링 전후의 클래스 구조 비교를 통해 잘 정리되어 있으며, 기존의 솔리드 원칙에 대한 샘플도 예쁘게 제작되어 있다.

  • 디자인 패턴 관련 샘플도 깔끔하게 정리되어 있어 학습의 재미를 더해준다.

1.6. ️ 오브젝트 풀 개선 사항
  • 오브젝트 풀의 형태가 "더 멋있어지고" 추가와 다듬어짐이 이루어진다고 언급된다.

  • 이러한 변화는 전체적인 품질 향상을 지향하고 있으며, 긍정적인 평가를 받는다.

  • 제품 구매에 대한 언급으로, "사면 괜찮다"는 의견이 제시된다.

 

2. 📚 MVVM 패턴의 특징과 활용

 
  • MVVM은 MVPMVC와 함께 UI 로직의 분리를 목표로 하는 디자인 패턴이다. 하지만 이들은 구조적으로 서로 연결될 수밖에 없으며 이는 스파게티 코드 문제를 야기할 수 있다.

  • MVVM에서는 데이터 바인딩 시스템을 통해 뷰와 뷰모델 간의 의존성을 약화시키고, 바인딩 설정을 통해 UI와 데이터 간의 동기화를 자동으로 수행할 수 있다.

  • MVVM은 유니티 6부터 지원되며, 다양한 UI 툴킷을 활용하여 보다 효율적인 UI 개발과 코드의 간결성을 제공한다.

  • 이러한 패턴은 복잡한 UI 환경에서 특히 유용하며, 코드의 유지보수성을 높이고 오류 발생 확률을 줄이는 등의 장점을 가진다. 그러나 간단한 환경에서는 그 설정이 복잡할 수 있다.

  • 각 디자인 패턴은 특정한 목적과 장단점을 가지므로, 상황에 맞춰 적절히 선택하여 사용해야 한다.

2.1. MVVM과 MVP 개요
  • 이번 시간에는 MVVM(Model-View-ViewModel) 패턴을 다룰 예정이다.

  • MVP(Model-View-Presenter)도 언급되었으며, 두 패턴 모두 UI 관련 작업에 활용되는 패턴이다.

  • 두 패턴은 시각적인 요소에 대한 차이는 없으며, 샘플도 동일하다 .

  • 샘플 예시로는 체력이 깎이고 리셋 버튼을 누르면 원래 상태로 돌아가는 인터페이스가 있다.

  • 체력이 줄어들 경우 UI에서 "Good", "Neutral", "Danger"로 변화하는 모습을 설명할 것이다 .

2.2. ️ UI 로직 관리 및 디자인 패턴의 중요성
  • MVC, MVP, MVVM 같은 패턴들은 UI 로직을 분리하는 데 목적이 있는 디자인 패턴이다.

  • 과거에는 프로그래머가 UI와 로직을 혼자서 관리했지만, 현재는 UI가 복잡해져 여러 사람이 공동 작업을 해야 하므로 시스템 구조의 아름다움이 중요하다.

  • 이러한 패턴들은 관심사 분리(Separation of Concerns, SoC)를 통해 클래스 간의 관계보다 더 큰 개념의 구조를 표현하며, 아키텍처 패턴으로 분류된다.

  • 다양한 툴셋 기반에서 이러한 패턴들이 사용되며, 예를 들어 유니티에서는 MVP 패턴을 채택하여 뷰와 프레젠터의 배열을 통해 서버와의 관계를 형성한다.

  • 결론적으로, 모든 디자인 및 아키텍처 패턴들의 핵심 목표는 잠재적인 스파게티 코드 방지이며, 신입 프로그래머는 이러한 패턴을 반드시 알고 있어야 한다.

2.3. MVC 패턴의 개요와 구조
  • MVC는 소프트웨어에서 UI 개발 시 사용되는 패턴으로, 논리적인 부분과 데이터를 분리하는 것이 주 핵심 목표이다.

  • 이 패턴의 주 목적은 종속성스파게티 코드를 줄이는데 있으며, 각 레이어에서 기능을 제한하여 단일 책임 원칙을 준수하도록 한다.

  • 모델은 어플리케이션 데이터를 관리하고 값을 보관하는 데이터 컨테이너로 기능한다.

  • 는 사용자에게 데이터를 보여주는 UI 역할을 하며, 컨트롤러는 입력 및 로직을 처리하는 부분이다.

  • MVC 구조는 결국 서로 엮일 수밖에 없는 구조로, 특히 사용자 입력 처리 과정에서 뷰와 컨트롤러는 긴밀히 연결된다.

2.4. MVC와 MVP 모델의 차이점 및 특징
  • 유니티에서는 MVC(모델-뷰-컨트롤러)와 MVP(모델-뷰-프레젠터) 모델이 채용되고 있으며, 이는 발전된 모델로 볼 수 있다.

  • 모델은 데이터와 관련된 규칙, 게임의 현재 상태 및 속성 데이터를 포함하고 있으며, 뷰에 대한 정보는 없다.

  • 프레젠터는 모델과 뷰 사이에서 중재 역할을 하며, 사용자 입력 이벤트를 처리하고 모델과 뷰를 업데이트한다.

  • MVP 패턴의 핵심은 모델과 뷰 간의 상호 작용을 없애고, 유저가 뷰와만 소통하게 하는 것이다.

  • 결과적으로 모델과 뷰를 완전히 분리시켜 확장성, 모듈성, 재사용성, 유지 관리성을 향상시킨다.

2.5. ️ MVVM 패턴의 이해와 적용
  • MVVM은 모델(M), 뷰(V), 뷰 모델(VM) 간의 관계를 정의하며, 기존의 MVPMVC 패턴보다 의존성을 약화시키는 구조이다.

  • 데이터 바인딩 시스템이 MVVM의 핵심으로, 뷰와 뷰 모델 간의 속성이 자동으로 동기화되어 UI 업데이트가 이루어진다.

  • MVVM은 프레임워크와 운영체제에 따라 데이터 바인딩 지원 여부가 다르므로, MVVM의 구현은 시스템 의존적이다.

  • MVVM은 유니티와 같은 다양한 플랫폼에서 활용될 수 있으며, UI 툴킷을 통해 구현하는 환경이 필요하다.

  • 현재 MVVM은 웹과 앱 개발에서 많이 사용되며, 프런트엔드 프레임워크인 앵귤러, Vue.js, 리액트 등이 MVVM 패턴을 지원하고 있다.

2.6. 유니티 UI 툴킷 개요
  • 유니티의 UI 툴킷은 UI 작업을 위한 UI 빌더를 제공하며, UI 전용 환경을 만들어 개발할 수 있도록 돕는다.

  • UI 툴킷은 UXML, USS 스타일시트, C#를 포함한 세 가지 요소로 구성되어 있으며, 이는 웹 개발에서의 구조와 유사하다.

  • UI 구성 요소는 UXML을 통해 하이라키를 기술하고, USS를 통해 스타일을 정의할 수 있다.

  • 람다식을 활용하면 복잡한 이벤트 연결을 간단하게 처리할 수 있으며, 바인딩 시스템 덕분에 자동으로 UI가 업데이트된다.

  • 사용자는 UI 빌더를 사용하여 스크립터블 오브젝트와 바인딩을 설정하고, 이를 통해 코드 양을 줄여 유지보수를 쉽게 할 수 있다.

2.7. ️ 자동 바인딩과 컨버터 활용
  • 헬스 뷰모델은 데이터와 UI를 자동으로 연결하는 바인딩 시스템을 제공하여, 업데이트 필요 없이 실시간으로 데이터가 변경된다.

  • 컨버터를 사용하면 값에 따라 UI 요소의 변화를 자동으로 관리할 수 있으며, 조건에 따라 색상과 문자를 변화시킬 수 있다.

  • UI 구성 요소인 헬스 바는 헬스 데이터와 바인딩되어, 체력이 변화함에 따라 실시간으로 표현이 갱신된다.

  • 데이터 변경에 대한 UI 업데이트는 일방향으로 이루어지며, MVVM 패턴을 적용하여 바인딩 설정 후 별도의 코드가 필요하지 않다.

  • UI 빌더를 통해 XML 형식으로 바인딩 정보를 확인할 수 있으며, 이는 이전의 수기 코드와 비교할 때 편리함을 제공한다.

2.8. ️ MVVM 패턴과 그 특징
  • MVVM 패턴은 바인딩 시스템을 통해 코드의 간결함과 유지보수 용이성을 제공한다.

  • MVVM은 데이터 바인딩 설정으로 자동 업데이트를 가능하게 하여 프로그래머의 신경을 덜어준다.

  • 하지만 바인딩 설정 시 추가적인 오버헤드가 발생할 수 있으며, 성능에 민감한 시스템에서는 적합하지 않을 수 있다.

  • MVVM은 복잡한 UI 환경, 특히 게임 개발과 같은 복잡한 데이터 구조에서 더 유리하므로, 상황에 맞게 사용해야 한다.

  • 모든 디자인 패턴은 장단점이 명확하므로, 개발 시 적절한 패턴을 선택하는 것이 중요하다.

 

3. 🛠️ 전략 패턴의 개념과 적용

 
  • 전략 패턴은 알고리즘 군을 정의하고, 각각의 알고리즘을 캡슐화하여 상호 교환 가능하게 만드는 디자인 패턴이다.

  • 이 패턴은 수정이 용이하고, 알고리즘이 다양한 행동을 필요로 할 때, 각 알고리즘을 클래스로 분리하여 관리할 수 있도록 돕는다.

  • 예를 들어, 게임의 스킬 시스템이나 아이템 시스템에서 서로 다른 행동을 구현할 때, 전략 패턴을 활용하면 클래스의 코드 증가를 방지하고 유지보수가 용이하다.

  • 전략 패턴은 특히 복잡한 조건문이나 스위치 케이스를 단순화할 수 있어, 프로토타입 개발 후 리팩토링 시 유용하게 활용된다.

  • 이 패턴은 모든 프로그램에서 적용 가능하며, 유니티의 다양한 기능에서도 널리 사용되고 있다는 사실을 강조한다.

3.1. Strategy 패턴 개요 및 데모
  • Strategy 패턴간단한 컨셉으로, 유니티와 C#, C++ 등 객체지향 프로그래밍의 기본 성질을 이용하고 있다.

  • 이 패턴은 설명할 내용이 많지 않으며, 데모를 통해 보여주는 것이 효과적이다.

  • 데모에서 보여지는 아이템은 각각 다양한 특성을 가지고 있지만, 처음에는 그 의미를 이해하기 어려울 수 있다.

  • 코드 분석을 통해 데모의 의미를 명확히 파악할 수 있으며, 이 과정을 통해 완전한 이해가 가능해진다.

3.2. ️ 전략 패턴 설명
  • 전략 패턴은 동일 계열의 알고리즘 군을 정의하고 캡슐화하며, 이들을 상호 교환 가능하도록 만든다.

  • 알고리즘이나 동작을 래핑하여 문제의 솔루션을 제공하고, 각 객체는 동적으로 실행될 수 있는 고유 동작을 캡슐화한다.

  • 런타임 시 알고리즘을 다양하게 변경할 수 있도록 하며, 이를 위해 베이스 클래스와 구체화된 클래스를 활용한다.

  • 게임의 어빌리티 시스템과 같이 각각의 스킬이 다양한 속성을 가질 경우, 이를 스위치 케이스로 구현하는 것은 복잡해질 수 있다.

  • 따라서 알고리즘을 별도의 클래스로 나누어 구현하는 것이 핵심이며, 스크립터블 오브젝트뿐만 아니라 다양한 클래스에서 적용 가능하다.

3.3. 프로그래밍에서의 어빌리티 구현 방식
  • 어빌리티라는 베이스 클래스를 만들어 이름과 액션 함수를 구현하여 기능을 추가하는 방식이다.

  • 사운드 출력, 이펙트 출력과 같이 공통적인 부분은 베이스 클래스에서 구현하고, 추가 기능은 상속받아 구현한다.

  • 각 아이템의 기능을 추가, 확장 가능하게 하여 기존의 코드에 영향을 주지 않고 새로운 기능을 구현할 수 있다.

  • 스트래티지 패턴은 상속 시스템을 활용하여 구현할 수 있으며, 이것이 개체 지향의 핵심이기도 하다.

  • 각 아이템마다 다르게 작동하는 방식이 있어, 각각의 구현 방식이 달라진다.

3.4. ️ 전략 패턴의 활용과 중요성
  • 전략 패턴은 행동들이 서로 다른 관련 클래스들이 있을 때 사용된다.

  • 각 클래스는 공통된 어빌리티를 가지며, 이에 따라 행동과 세부 알고리즘이 달라진다.

  • 알고리즘 변형이 필요할 경우, 상속관계를 통해 파생 클래스 생성이 가능하다.

  • 사용자가 모르게 알고리즘을 감추고, 프레임워크를 통해 배포할 때도 전략 패턴을 적용할 수 있다.

  • 전략 패턴은 리팩토링 시 자주 사용되며, 특히 객체 지향 프로그램의 핵심적 요소로 기능한다.

3.5. 전략 패턴의 적용 사례와 중요성
  • 전략 패턴은 유니티의 렌더러 피처와 같은 기능에서 자주 발견되며, 복잡한 사용자는 그 이름을 명시적으로 알지 못할 수도 있다.

  • 유니티의 Scriptable Render 기능은 상속을 통해 데칼 렌더러 피처 등 다양한 기능을 추가할 수 있어, 전략 패턴의 특성을 잘 보여준다.

  • 하드코딩된 구조가 아닌 전략 패턴을 사용하면 사용자가 자유롭게 추가하고 변경할 수 있는 환경이 제공되며, 이는 유연성을 높인다.

  • 전략 패턴의 핵심은 공통적으로 수행해야 할 기능을 가진 클래스들을 설정하여, 유지보수와 확장성을 용이하게 하는 것이다.

  • 디자인 패턴은 동일한 형식일 필요 없고, 핵심 원칙인 SOLID 원칙을 준수할 수 있다면 개발자는 새로운 패턴을 창출할 수 있다.

 

4. ✈️ 플라이웨이트 패턴과 스크립터블 오브젝트

 
  • 플라이웨이트 패턴은 메모리 절약과 성능 최적화에 중점을 두고 있는 디자인 패턴이다.

  • 이 패턴은 여러 객체가 리소스를 공유하여 메모리를 절약하는 데 도움을 준다.

  • Unity에서는 플라이웨이트 패턴을 구현하기 위해 스크립터블 오브젝트를 사용해, 공통 데이터를 재사용하고 인스턴스별로 필요한 데이터만 개별적으로 관리할 수 있다.

  • 스크립터블 오브젝트를 활용하면 코드가 더 간결해지고, 메모리 사용량이 줄어드는 효과가 있다.

  • 플라이웨이트 패턴은 메모리 관점에서 설계된 디자인 패턴으로, Unity와 같은 프레임워크를 활용하면 쉽게 적용할 수 있다.

 

5. 🏷️ 더티 플래그 패턴의 개념과 활용

 
  • 더티 플래그 패턴은 메모리 관리를 효율적으로 하기 위한 중요한 개념으로, 활성화와 비활성화를 통해 시스템의 리소스를 최적화한다.

  • 이 패턴은 오픈 월드 게임에서 청크 단위로 로딩하여 플레이어가 현재 보고 있는 지역만을 관리하는 방식으로 사용된다.

  • 더티 플래그는 일반적으로 불리언 플래그로 구현되며, 상태가 자주 변경되는 동적 객체에 대한 불필요한 계산을 최소화한다.

  • UI 트랜스폼 및 그래픽 변경 등에서 다양한 형태의 더티 플래그가 존재하여, 성능 오버헤드를 줄이기 위한 처리가 필요하다.

  • 이 패턴은 대부분의 시스템에서 광범위하게 사용되며, 복잡한 계층 구조에서 효율적인 계산을 위해 필수적이다.

5.1. ️ 더티 플래그 패턴 개요
  • 더티 플래그 패턴은 디자인 패턴으로 분류되는지 논란이 있지만, 널리 사용되는 개념으로 흔히 포함된다.

  • 샘플을 통해 더티 플래그 패턴을 이해하기 어려운 점이 있으며, 소개된 샘플만으로는 개념이 명확하지 않을 수 있다.

  • 다른 패턴은 이름을 통해 의미를 어느 정도 유추할 수 있으나, 더티 플래그는 그 의미가 생소하게 느껴질 수 있다.

5.2. 메모리 효율적 관리를 위한 더티 플래그 시스템
  • 오픈 필드에서 캐릭터 주변의 아이들만 로딩되고, 캐릭터가 벗어날 경우 해당 로딩이 내려가야 한다.

  • 광활한 월드를 한 번에 로딩하면 메모리가 터질 수 있어, 보통 청크 단위로 나눠 캐릭터가 볼 수 있는 지역만 로딩된다.

  • 이 시스템에서 더티 플래그를 사용하여 활성화 및 비활성화를 관리하게 된다.

  • 더티 플래그 시스템은 모든 시스템에서 일반적으로 사용되며 최적화와 관련된 내용으로, 광범위하게 활용된다.

  • 용어의 어원에 대한 확실한 설명은 없지만, 수십 년간 이어진 전통이 존재하며 많은 사람들이 모른다.

5.3. 하이어라키 시스템과 더티 플래그의 필요성
  • 하이어라키 시스템은 자동차와 같은 복잡한 구조에서 일반적으로 사용되며, 각 구성 요소가 계층적으로 연결되어 있다.

  • 하이어라키 시스템에서는 부모 객체가 변경될 경우, 그 하위 자식 객체들도 연산해야 하므로 많은 계산이 필요하다.

  • 이로 인해 더티 플래그 시스템이 필수적이며, 특정 상태 변경을 추적하여 불필요한 계산을 줄인다.

  • 더티 플래그는 보통 단순한 불리언 플래그로 구현되며, 변경 사항을 모아두었다가 한 번에 업데이트 한다.

  • 이러한 시스템은 모든 엔진에서 필요하며, 동적 객체의 상태 변경에 대한 불필요한 계산을 최소화하는 것이 주 목적이다.

5.4. UI 더티 플래그 시스템 이해하기
  • UI 시스템은 계층 구조를 가지며, 각각의 요소가 서로 연결되어 있다.

  • UI 엘리먼트의 레이어가 변경될 때 더티 플래그를 사용하여 내부적으로 상태를 관리한다.

  • 여러 종류의 더티 플래그가 존재하며, 레이아웃과 그래픽을 별도로 처리한다.

  • 성능 최적화를 위해 변경 사항이 생길 때마다 메시지를 재생성하는 것이 아니라, 더티 플래그를 통해 나중에 배칭 처리한다.

  • 플레이어의 위치에 따라 로딩과 언로딩을 관리하며, 관련 섹터의 더티 플래그를 체크하여 메모리를 효율적으로 사용할 수 있다.

5.5. ️ 프로그래밍 디자인 패턴 요약
  • 이번 영상에서는 네 가지 디자인 패턴인 MVVM 패턴, 스트래티지 패턴, 플라이웨이트 패턴, 더티 플래그를 살펴보았다.

  • 플라이웨이트와 더티 플래그 패턴은 선택이 다른 패턴으로, 유니티 에셋을 활용할 때 전략적으로 사용할 수 있는 중요한 기능이다.

  • 더티 플래그는 오픈월드 씬 로딩 등의 복잡한 시스템에서 활용되며, 단순히 볼 수 있는 지역과 플레이어가 직접 이동하는 지역에 따라 비주얼과 물리적 요소를 나눠서 로딩해야 한다.

  • 이번 영상에서 보여준 샘플은 간략화된 예시로, 실제 오픈월드 시스템은 더 복잡하므로 본 내용을 참고해야 한다.

  • 해당 영상에서는 모든 패턴을 다뤘고, 유니티의 레벨업 디자인 패턴 이북이 출시 중이며, 번역이 완료되면 나중에 공유할 예정이다.