무엇을 찾고 계신가요?
Hero background image
런타임에 객체 생성에 팩토리 패턴을 사용하는 방법

Unity 프로젝트에서 일반적인 게임 프로그래밍 디자인 패턴을 구현하면 깔끔하고 체계적이며 가독성 높은 코드베이스를 효율적으로 빌드하고 유지 관리할 수 있습니다. 디자인 패턴은 리팩터링과 테스트 시간을 줄여 개발 프로세스의 속도를 높이고 게임, 팀, 비즈니스의 성장을 위한 탄탄한 기반을 마련합니다.

디자인 패턴은 코드에 복사하여 붙여넣을 수 있는 완성된 솔루션이 아니라 더 크고 확장 가능한 애플리케이션을 구축하는 데 도움이 되는 추가 도구라고 생각하세요.

이 페이지에서는 팩토리 디자인 패턴에 대해 설명합니다.

이 콘텐츠는 무료 전자책을 기반으로 합니다, 게임 프로그래밍 패턴으로 코드 레벨 업하기.

Unity 게임 프로그래밍 디자인 패턴 시리즈에 대한 자세한 내용은 Unity 베스트 프랙티스 허브 또는 다음 링크를 통해 확인할 수 있습니다:

공장 다이어그램
팩토리 디자인 패턴은 슈퍼클래스에서 객체를 생성하기 위한 인터페이스를 제공하지만, 서브클래스가 생성될 객체의 유형을 변경할 수 있도록 허용합니다.
공장 패턴 이해

때로는 다른 객체를 생성하는 특별한 객체가 있으면 도움이 될 수 있습니다. 많은 게임은 게임 플레이 과정에서 다양한 사물이 생성되기 때문에 실제로 필요할 때까지 런타임에 무엇이 필요한지 알 수 없는 경우가 많습니다.

공장 패턴은 이러한 목적을 위해 공장이라는 특수 개체를 지정합니다. 한 수준에서는 "제품"을 생성하는 데 관련된 많은 세부 사항을 요약합니다. 즉각적인 이점은 코드를 깔끔하게 정리할 수 있다는 것입니다.

그러나 각 제품이 공통 인터페이스 또는 기본 클래스를 따르는 경우 한 단계 더 나아가 자체 구성 로직을 더 많이 포함하도록 하여 공장 자체에서 숨길 수 있습니다. 따라서 새로운 객체를 생성하는 것이 더욱 확장 가능해집니다.

공장을 하위 클래스화하여 특정 제품 전용 공장을 여러 개 만들 수도 있습니다. 이렇게 하면 런타임에 적, 장애물 또는 기타 모든 것을 생성하는 데 도움이 됩니다.

공장 샘플 프로젝트
한 제품은 소리를 재생하고 다른 제품은 입자를 재생합니다. 둘 다 동일한 인터페이스를 사용합니다.
샘플 프로젝트에서 팩토리 패턴 테스트

팩토리 패턴을 포함하여 게임 개발의 맥락에서 다양한 프로그래밍 디자인 패턴을 보여주는 샘플 프로젝트는 GitHub에서 확인할 수 있습니다.

팩토리 패턴 샘플은 플레이어가 미로를 돌아다니는 코드로 구성되어 있습니다. 미로에서 제품이라는 두 개의 서로 다른 게임 오브젝트를 클릭하여 스폰할 수 있습니다. 둘 다 동일한 인터페이스를 사용하고 모양도 비슷하지만, 하나는 파티클을 생성하고 다른 하나는 사운드를 재생합니다.

공장 패턴 장면은 "6 공장"이라는 폴더에 있습니다.

간단한 공장 만들기

게임 레벨의 아이템을 인스턴스화하는 팩토리 패턴을 생성한다고 가정해 보겠습니다. 프리팹을 사용하여 게임 오브젝트를 생성할 수 있지만 각 인스턴스를 생성할 때 커스텀 동작을 실행할 수도 있습니다.

이 로직을 유지하기 위해 if 문이나 스위치를 사용하는 대신 코드 예제에 설명된 대로 IProduct라는 인터페이스와 Factory라는 추상 클래스를 만드세요.

제품은 메소드에 대한 특정 템플릿을 따라야 하지만 그렇지 않으면 기능을 공유하지 않습니다. 따라서 IProduct 인터페이스를 정의합니다.

팩토리에는 일부 공유 공통 기능이 필요할 수 있으므로 이 샘플에서는 추상 클래스를 사용합니다. 서브클래스를 사용할 때는 SOLID 원칙의 리스코프 치환을 염두에 두세요. 슈퍼클래스의 객체는 프로그램의 정확성에 영향을 주지 않고 서브클래스의 객체로 대체할 수 있어야 한다고 명시하고 있습니다. 즉, 슈퍼클래스 참조를 사용하는 모든 프로그램은 그 하위 클래스를 알지 못해도 사용할 수 있어야 합니다.

인터페이스를 사용하여 제품 간의 공유 속성 및 로직을 정의합니다.
인터페이스를 사용하여 제품 간의 공유 속성 및 로직을 정의합니다.
팩토리 패턴의 클래스 구조

IProduct 인터페이스는 제품 간의 공통 사항을 정의합니다. 이 경우 제품 이름 속성과 제품이 초기화에서 실행되는 모든 로직만 있으면 됩니다.

그런 다음 IProduct 인터페이스를 따르는 한 필요한 만큼의 제품(제품A, 제품B)을 정의할 수 있습니다.

기본 클래스인 Factory에는 IProduct를 반환하는 GetProduct 메서드가 있습니다. 추상적이기 때문에 팩토리 인스턴스를 직접 만들 수는 없습니다. 실제로 다른 제품을 얻을 수 있는 두 개의 콘크리트 서브클래스(ConcreteFactoryA와 ConcreteFactoryB)를 도출합니다.

이 예제에서 GetProduct는 특정 위치에 프리팹 게임 오브젝트를 더 쉽게 인스턴스화할 수 있도록 Vector3 위치를 사용합니다. 각 콘크리트 공장의 필드에는 해당 템플릿 프리팹도 저장됩니다.

그 결과 위 이미지와 같은 구조가 만들어집니다.

코드 예제

코드 스니펫에서 샘플 ProductAConcreteFactoryA를 볼 수 있습니다.

여기서는 IProduct를 구현하는 제품 클래스 MonoBehaviours가 공장에서 프리팹을 활용하도록 만들었습니다.

각 제품마다 고유한 초기화 버전을 가질 수 있다는 점에 유의하세요. ProductA 프리팹 예제에는 콘크리트팩토리A가 사본을 인스턴스화할 때 재생되는 파티클시스템이 포함되어 있습니다. 팩토리 자체에는 파티클을 트리거하는 특정 로직이 포함되어 있지 않으며, 모든 제품에 공통으로 적용되는 Initialize 메서드만 호출합니다.

샘플 프로젝트를 살펴보고 클릭투크리에이트 컴포넌트가 어떻게 팩토리 간에 전환하여 서로 다른 동작을 가진 제품A와 제품B를 생성하는지 확인해 보세요. 제품B는 스폰될 때 사운드를 재생하고, 제품A는 제품 변형의 핵심 개념을 설명하기 위해 파티클 효과를 설정합니다.

장단점

많은 제품을 설정할 때 공장 패턴의 이점을 가장 많이 누릴 수 있습니다. 애플리케이션에서 새 제품 유형을 정의해도 기존 제품 유형이 변경되거나 이전 코드를 수정할 필요가 없습니다.

각 제품의 내부 로직을 자체 클래스로 분리하면 팩토리 코드가 상대적으로 짧아집니다. 각 공장은 기본 세부 정보를 알지 못한 채 각 제품에 대해 초기화를 호출하는 것만 알고 있습니다.

단점은 패턴을 구현하기 위해 많은 클래스와 서브클래스를 만들어야 한다는 것입니다. 다른 패턴과 마찬가지로 약간의 오버헤드가 발생하므로 다양한 제품을 보유하지 않는 경우 불필요할 수 있습니다. 반면에 클래스를 설정하는 데 소요되는 초기 시간은 코드를 분리하고 유지 관리가 더 쉬워진다는 측면에서 장기적으로는 좋은 일일 수 있습니다.

공장 패턴 적용

팩토리의 구현은 여기에 표시된 것과 크게 다를 수 있습니다. 자체 공장 패턴을 구축할 때 다음과 같은 조정 사항을 고려하세요:

사전을 사용하여 제품을 검색합니다: 제품을 사전의 키-값 쌍으로 저장하고 싶을 수도 있습니다. 고유한 문자열 식별자(예: 이름 또는 일부 ID)를 키로 사용하고 유형을 값으로 사용합니다. 이렇게 하면 제품 및/또는 해당 공장을 더 편리하게 검색할 수 있습니다.

공장(또는 공장 관리자)을 정적으로 만드세요: 이렇게 하면 사용하기는 더 쉬워지지만 추가 설정이 필요합니다. 정적 클래스는 인스펙터에 표시되지 않으므로 제품 컬렉션도 정적으로 만들어야 합니다.

비게임 오브젝트 및 비모노비헤이비어에 적용합니다: 프리팹이나 기타 Unity 전용 컴포넌트에 국한하지 마세요. 팩토리 패턴은 모든 C# 객체에서 사용할 수 있습니다.

객체 풀 패턴과 결합합니다: 팩토리에서 반드시 새 객체를 인스턴스화하거나 생성할 필요는 없습니다. 또한 계층 구조에서 기존 항목을 검색할 수도 있습니다. 한 번에 많은 오브젝트를 인스턴스화하는 경우(예: 무기의 발사체) 오브젝트 풀 패턴을 사용하면 보다 최적화된 메모리 관리를 할 수 있습니다.

공장은 필요에 따라 모든 게임플레이 요소를 생성할 수 있습니다. 하지만 제품을 만드는 것이 유일한 목적은 아닌 경우가 많습니다. 팩토리 패턴을 다른 큰 작업의 일부로 사용할 수도 있습니다(예: 게임 레벨 일부의 대화 상자에 UI 요소를 설정하는 경우).

블로그 게시물
리소스 더 보기

무료 전자책 ' 게임 프로그래밍 패턴으로 코드 레벨업'에서 Unity 애플리케이션에서 디자인 패턴을 사용하는 방법과 SOLID 원칙에 대한 자세한 팁을 확인하세요.

모든 고급 Unity 기술 전자책과 문서는 베스트 프랙티스 허브에서 확인할 수 있습니다. 이 전자책은 문서 내 고급 모범 사례 페이지에서도 확인할 수 있습니다.

이 콘텐츠가 마음에 드셨나요?