E4-Unreal / test-simple-game-framework

simpleFramework for UE 5.1.0
MIT License
0 stars 1 forks source link

상태 패턴과 싱글톤 패턴 #50

Open Eu4ng opened 1 year ago

Eu4ng commented 1 year ago

고찰

상태 패턴 적용

EquipmentComponent를 만드는 과정에서 주 장비와 보조 장비를 들고 있을 경우, 장비 스왑 로직이 달라지기 때문에 처음에는 중첩 if문으로 구현하였지만 코드 가독성이 많이 떨어지고 장비 카테고리가 늘어날수록 로직이 복잡해져갔다.

이를 해결하기 위해 상태 패턴을 적용 시켜보았다. 일반적으로 상태 패턴 예제에서는 상태가 변할 때, 이 경우에는 주 장비를 들고 있는 상태에서 보조 장비를 들고 있는 상태로 전환되거나 반대의 경우에 새로운 상태 객체를 생성하여 이를 대입하는 방식으로 상태 전환이 이루어진다.

정적 상태 객체

하지만 장비 스왑과 같이 상태가 자주 바뀌는 경우에는 이렇게 새로운 상태 객체를 매번 생성하는 것은 비효율적이라는 생각이 들었고 각 상태 객체를 하나만 생성하여 이를 사용하는 정적 상태 객체에 대해 알아보았다. 그러나 이는 모든 EquipmentComponent에서 정적 상태 객체를 공유하는 방식이었고, 다음과 같은 문제가 발생하였다.

주 장비에서 보조 장비로 장비 스왑이 일어나는 경우, 주 장비를 Disable 시키고 보조 장비를 장착하고 있다가 원래 들고 있던 주 장비를 장착하기 위해서는 원래 들고 있던 주 장비를 기억해둘 필요성이 있는데 이는 각 플레이어마다 달라야한다. 즉, 이 경우에는 1개의 EquipmentComponent당 1개의 상태 객체를 생성해야지 정적 상태 객체를 생성하여 n개의 EquipmentComponent에서 공유해서 사용하는 상태 객체를 사용할 수는 없었다.

요약하자면 상태 객체가 개별적으로 관리하는 변수가 존재하는 경우에는 정적 객체를 사용할 수 없다는 의미이다. 이 경우에는 주 장비 장착 상태는 주 장비에 대한 정보를 관리하고 있기 때문이다.

싱글톤 패턴

싱글톤 패턴은 처음 생성한 객체 하나만을 사용한다는 것이 핵심이다. 즉, new 키워드를 통해 아무리 새로운 객체를 생성하여도 제일 처음에 생성된 객체가 대입된다는 의미이다.

사실 위 문제를 해결하기 위해 Outer에서 각 상태별로 생성된 하나의 상태 객체를 변수로 저장한 뒤, 이를 교체하는 방식으로 사용중이었는데 싱글톤 패턴을 사용하면 쉽게 해결할 수 있을 것 같다.

상태 클래스에 싱글톤 패턴을 적용하면 (기본 생성자를 통해 인스턴스를 1개만 생성 후 이후에는 생성된 인스턴스만 대입) 상태를 전환할 때 new 키워드로 새로운 상태 객체를 생성하여도 처음 생성한 상태 객체가 그대로 대입될 것이다.

다만, 언리얼에서는 new가 아니라 NewObject로 객체를 생성하므로 동일하게 동작하는지 혹은 CDO로 반환되는지에 대해서는 확인이 필요하다.

참고 링크