[UNITY]/TIL: UNITY

[디자인패턴] 전략패턴에 관하여

네,가능합니다 2024. 10. 28. 22:30

오늘은 스탠다드반 특강이 있었는데, 매번 특강을 들을 때 마다 사실 벽을 느낀다.

내가 이해를 너무 못하고 있는게 아닐까 ? 이걸 다 이해할 수 있는건가 ?

물론 이미 알고있고, 이해한 부분도 많지만 이해하기 힘든 부분도 꽤 있었던 것 같다.. ㅎㅎ

 

그리고 나는 개발자가 벽을 느끼는것은 버그를 만난것처럼 아주 좋은 증상이라고 생각한다.

빨리 배우는것이 빨리 고치는것만큼 좋은것같다.

항상 이런 이해하기 힘든것을 이해했을때 아 내가 성장하고 있는게 맞구나 라고 느끼는것같다.

 

그럼 이제 전략패턴에 대해 알아보자.

 

전략패턴이란 ?

알고리즘을 캡슐화 하여 동적으로 교체할 수 있게 하는 코딩규칙이다.

 

이게 무슨소리냐 ? 나도 모르겠다.. 이해할때까지 계속해서 알아보자.

 

전략패턴의 개념

  • 행위를 정의하는 인터페이스를 만들고, 이 인터페이스를 구현한 여러가지 전략을 만들어 각기 다른 동작을 구현한다.
  • 전략 객체를 외부에서 주입하거나, 필요한 시점에 동적으로 설정할 수 있다.

1. 인터페이스를 설정하고 2. 해당 인터페이스를 구현하고 3. 구현된 클래스를 알맞게 사용한다.

 

 

이렇게 까지 작성한뒤에 내가 전략패턴에 대해서 더 알아보았다.

 

왜냐하면 사실 이해가 안됐기 때문이다.

 

이게 무슨말이냐면 전략패턴은 추상적인것이기때문이다.

 

우선 아래의 전략패턴의 예제를 보자.

 

// 무기의 행동을 정의하는 인터페이스
public interface IWeaponStrategy
{
    void UseWeapon();
}
// 인터페이스를 구현해주고
public class SwordStrategy : IWeaponStrategy
{
    public void UseWeapon()
    {
        Debug.Log("검을 휘두른다.");
    }
}

public class BowStrategy : IWeaponStrategy
{
    public void UseWeapon()
    {
        Debug.Log("화살을 발사한다.");
    }
}

public class MagicStrategy : IWeaponStrategy
{
    public void UseWeapon()
    {
        Debug.Log("마법을 사용한다.");
    }
}
// 무기를 사용한다.
public class Character
{
    private IWeaponStrategy weaponStrategy;

    public void SetWeapon(IWeaponStrategy newWeaponStrategy)
    {
        weaponStrategy = newWeaponStrategy;
    }
    // 현재 설정된 무기를 사용
    public void Attack()
    {
        if (weaponStrategy != null)
        {
            weaponStrategy.UseWeapon();
        }
        else
        {
            Debug.Log("무기가 없습니다.");
        }
    }
}

 

이런 방식으로 작성한 다음 아래의 코드에서 필요에 따라 동적으로 무기를 바꿔준다.

 

public class GameController : MonoBehaviour
{
    private void Start()
    {
        Character character = new Character();

        character.SetWeapon(new SwordStrategy());
        character.Attack();

        character.SetWeapon(new BowStrategy());
        character.Attack();

        character.SetWeapon(new MagicStrategy());
        character.Attack();
    }
}

 

이게 전략패턴의 예제이다.

 

전략패턴의 예제를 보면 알겠지만 모르고 보면 그냥 캡슐화가 잘 된 코드로 보인다.

 

그렇다 전략패턴의 진짜 핵심은 캡슐화를 하고 손쉽게 교체가능한 코드인것이다.

 

이제 이해가 되기 시작했을것이다.(나도 적으면서 이제 이해됨..)

 

갑자기 마법무기가 사라져도

새로운 무기가 생겨도

기존의 무기가 변경되어도

 

다른 코드에 별 다른 영향을 주지않는 아주 객체지향적인 코딩 방식의 틀이라고 생각하면 된다.

 

전략패턴을 사용하기 적합하지 않다고 해서, 캡슐화를 하지 않는것은 올바르지 않다.

 

하지만 캡슐화를 했다고 해서 전략패턴을 꼭 사용해야하는것도 아니다.

 

이런 디자인패턴을 무조건 적용 해야 한다고 생각하지 말고 왜 사용해야하는지

어떤 부분이 핵심인지

전달하고자 하는 바를 이해하고 코딩하는 연습을 해보자