내일배움캠프 30일차 TIL, 디자인패턴 - 전략패턴

황오영·2024년 5월 28일
0

TIL

목록 보기
30/56
post-custom-banner

특강 - 디자인패턴

디자인 패턴?

  • 소프트웨어 개발 방법에서 사용되어 프로그램 개발에서 자주 나타내는 과제를 해결하기 위한 방법을 의미힌다.
  • 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것
  • 유니티에서 대표적으로 사용해본것은 싱글톤, 오브젝트폴링, 컴포넌트 패턴등등..
  • 디자인 패턴은 기본적으로 객체지향의 4대특성인 캡슐화, 상속, 추상화,다형성 + SOLID설계 원칙을 기반으로 되어있다.
  • 이번 특강에선 4개를 소개해 주셨다.

전략패턴

  • 하나의 로봇에 다양한 소프트웨어를 설치하여 그 로봇의 역할을 변화시키는 것과 같다.
  • 로봇에 청소 소프트웨어를 설치하면 청소 로봇 경비 소프트웨어를 설치하면 경비 로봇이 되는것처럼 어떤 소프트웨어를 사용하느냐에 따라 역할과 해동이 정해진다.
  • 전략 패턴은 로직군을 정의 하고 로직군을 교체하게 만드는 패턴 클라이언트는 구체적인 행동을 독립적으로 정의할 수 있다.
  • 즉 전략패턴은 객체지향 그 자체인 패턴이다. 공통적인 내용을 추상화하고 이를 동적으로 프로그램의 실행 흐름을 변경시켜준다.

흐름도

(출처 : 챌린지반 특강자료)

  • 기본적으로 interface로 정의를 해두고 각각이 재정의 하여 부품을 갈아 끼우듯이 사용하는 방식이다.

예제

public interface ICharacterAction
{
    void Execute();
}

public class JumpAction : ICharacterAction
{
    public void Execute()
    {
        Debug.Log("Jumping");
    }
}

public class RunAction : ICharacterAction
{
    public void Execute()
    {
        Debug.Log("Running");
    }
}

public class ShootAction : ICharacterAction
{
    public void Execute()
    {
        Debug.Log("Shooting");
    }
}

public class Character : MonoBehaviour
{
    private ICharacterAction characterAction;

    public void SetAction(ICharacterAction newAction)
    {
        characterAction = newAction;
    }

    void Update()
    {
        characterAction?.Execute();
    }
}
  • 전략 인퍼테이스 및 구현부, interface를 선언해 주고 각각의 클래스에서 이를 상속 받은 뒤 선언을 해주게 되면 Character에서 이를 받아 와서 실행을 시켜준다.
public class GameController : MonoBehaviour
{
    public Character character;

    void Start()
    {
        character.SetAction(new JumpAction());
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.J))
        {
            character.SetAction(new JumpAction());
        }
        else if (Input.GetKeyDown(KeyCode.R))
        {
            character.SetAction(new RunAction());
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            character.SetAction(new ShootAction());
        }
    }
}
  • 실제 컨트롤러에서 입력을 받고 키값에 따라서 행동을 다르게 정의해주면 된다!

언제 사용하면 좋을까

  • 전략 알고리즘의 여러 버전 또는 변형이 필요할 때 클래스화를 통해 관리
  • 알고리즘 코드가 노출되어서는 안되는 데이터에 엑세스 하거나 데이터를 활용할 때
  • 알고리즘의 동작이 런타임 도중 실시간으로 교체될 때

단점과 주의점

  • 알고리즘이 많아질수록 관리해야되는 객체의 수가 늘어난다.
  • 알고리즘이 자주 변경되지 않고 간단하다면 굳이 인터페이스를 만들어 프로그램을 복잡하게 만들 필요가 없다.
  • 개발자가 적절한 전략을 선택하기 위해 전략간의 차이점을 알고 있어야한다.

Temaplate Method와의 비교

  • 전략 패턴과 탬플릿 메서드 패턴은 알고리즘을 때에 따라 적용한다는 컨셉에서는 비슷하다.
  • 개방형 폐쇄 원칙을 충족하고 코드를 변경하지 않고 쉽게 소프트웨어를 확장하는데 사용된다.
  • 다만 전략 패턴은 합성을 통해 해결책을 찾고 템플릿은 상속을 통해 해결책을 찾는다.
  • 그래서 전략패턴은 결합이 느슨하지만 템플릿 메서드는 모듈이 밀접하게 결합된다.
  • 전략패턴은 인터페이스를 사용하고 템플릿은 추상혹은 구체적인 클래스를 사용한다.
  • 전략 패턴은 전체 전략을 변경 할 수 있지만 템플릿 메서드는 일부만 변경 가능해 나머지는 변경 되지 않은 상태로 템플릿에 종속이 되어버린다. 그렇기 때문에 단일상속만이 가능한 자바에서는 보통 전략패턴이 좀 더 많이 사용된다고 한다! 유니티는 상속 갯수 제한이 없기 때문에 둘다 가능할듯?

오늘의 회고

  • 배운건 4개였는데.. 쓰다보니 좀 길어져서 나눠서 포스팅을 해야겠다. 오늘은 전략패턴만!
  • 다양한 디자인패턴을 알고 강의에서도 상속을 자주 쓰며 구조를 짜주시다 보니 요즘 상속에 대해서 많이 배우고 있는것같아서 기분이 좋다.
  • 오늘 팀원분들과 이런저런 유니티 지식이랑 최종 프로젝트 얘기했는데 유익한 시간이 었다. 토크를 자주 나눠서 이런저런 지식을 많이 배워야겠다.
profile
게임개발을 꿈꾸는 개발자
post-custom-banner

0개의 댓글