1. 전략패턴 예제 작성
public interface IMoveStrategy
{
void Move();
}
인터페이스
using UnityEngine;
public class RunStrategy : IMoveStrategy
{
public void Move()
{
Debug.Log("캐릭터가 뜁니다.");
}
}
using UnityEngine;
public class WalkStrategy : IMoveStrategy
{
public void Move()
{
Debug.Log("캐릭터가 걷습니다.");
}
}
인터페이스로 Move 이동을 정의한 다음 뛰기와 걷기 스크립트를 만들어서 그곳에서 동작을 작성
using UnityEngine;
public class Character : MonoBehaviour
{
private IMoveStrategy moveStrategy;
/// <summary>
/// 전략 설정
/// </summary>
/// <param name="moveStrategy">전략</param>
public void SetMoveStrategy(IMoveStrategy strategy)
{
moveStrategy = strategy;
}
public void Move()
{
if (moveStrategy != null)
{
moveStrategy.Move();
}
else
{
Debug.Log("이동전략이 없습니다.");
}
}
}
인터페이스를 가지고 있는 변수를 매게변수로 받아서 그변수를 저장해두고 그 변수에 해당하는 움직임을 실행한다.
using UnityEngine;
public class GameManager : MonoBehaviour
{
void Start()
{
Character character = new Character();
// 걷기 전략
character.SetMoveStrategy(new WalkStrategy());
character.Move();
// 뛰기 전략
character.SetMoveStrategy(new RunStrategy());
character.Move();
}
}
게임매니저에서는 실제 실행동작을 작성
전략패턴은 객체의 행위를 캡슐화 하여 동적으로 변경 할 수 있도록 하는 패턴이다.
특정 기능을 인터페이스로 분리하고 여러개의 구체적인 전략을 별도의 클래스로 만들어 런타임에 교체할 수 있도록 하는 방식이다.
전략패턴의 핵심 요소로는
1. 전략 인터페이스
2. 인터페이스를 구현하는 여러개의 클래스, 실제 동작을 가지고있음
3. 전략을 사용하는 주체, 실행시점에서 어떤 전략을 사용할지 결정하고 실행
사용이유는
1. 유연성 증가, 실행 중에 전략을 쉽게 변경 가능
2. 코드 유지보수성 향상
3. Open-Closed Principle 개방 패쇄 원칙 준수, 새로운 전략을 추가해도 기존코드를 바꿀 필요가 없다.
사용 예시
1. 게임캐릭터 이동방식
2. AI공격패턴
3. 데이터 정렬알고리즘 변경
4. 결제 수단 선택
전략패턴은 if-else의 남용을 피하고 유연하게 알고리즘을 변경할 수 있도록 도와주는 패턴
2. 상태 패턴 예제 작성
public interface ICharacterState
{
void HandleInput(StateCharater stateCharater);
void UpdateState(StateCharater stateCharater);
}
입력처리 부분과 실행부분을 인터페이스에 공통적으로 정의한다.
using UnityEngine;
public class IdleState : ICharacterState
{
public void HandleInput(StateCharater stateCharater)
{
if (Input.GetKey(KeyCode.W))
{
stateCharater.SetState(new WalkingState());
}
}
public void UpdateState(StateCharater stateCharater)
{
Debug.Log("캐릭터가 가만히 있습니다.");
}
}
위와 같이 입력부분을 작성하고 실행부분에는 실제 동작 로직을 작성한다.
using UnityEngine;
public class StateCharater : MonoBehaviour
{
private ICharacterState currentState;
void Start()
{
currentState = new IdleState();
}
// Update is called once per frame
void Update()
{
currentState.HandleInput(this);
currentState.UpdateState(this);
}
public void SetState(ICharacterState characterState)
{
currentState = characterState;
}
}
실제 플레이어에게 넣는 스크립트는 처음 시작할때에는 idle 상태로 정의해주고 상태 입력과 동작을 업데이트에 넣어준다. 그리고 상태를 변화해주는 함수를 작성한다.
코드 동작방식
Idle상태에서 w를 눌렀을때 HandlerInput에서 SetState를 실행하고 SetState의해 현재 상태가 walking으로 변화하고 update 에서 walking에 대한 동작을 실행한다.
상태패턴은 객체의 상태를 클래스로 분리하고, 상태에 따라 동작이 변경되도록 만드는 디자인패턴이다.
객체가 여러 상태를 가질때 상태별 행동을 if-else 또는 switch-case로 처리하는 대신 개별 클래스로 분리하여 관리한다.
상태패턴의 핵심 요소
1. 상태 인터페이스
2. 구체적인 상태, 실행될 동작을 구현
3. 상태를 관리하는 객체, 현재 상태를 저장하고 상태전환을 수행
상태패턴의 사용 이유는
1. 코드의 가독성 향상
2. 유지보수성 증가
3. Open-Closed Principle 개방 패쇄 원칙 준수
4. 상태 전환이 명확해짐, 객체가 현재상태를 인식하고 자동으로 변경
이렇게 두가지 패턴을 공부하던 중 둘이 비슷해 보이는데 다른점이 뭘까? 라는 생각이 들었다.
그리고 오늘 공부를 토대로 생각을 해보니 전략패턴은 GameManager에서 직접 전략을 설정해 주어야 전환이 가능했다.
하지만 상태패턴은 조건이 맞다면 자기가 알아서 상태를 변환을 했다는 차이점이 있다는 것을 깨달았고 추가적으로 찾아보니
상태패턴
1. 상태패턴은 현재상태를 기억하고 있으며 상태변화에 따라 행동이 변경된다.
2. 객체 내부에서 상태 변경이 일어난다.
전략 패턴
1. 행위를 외부에서 변경할 수 있도록 전략을 캡슐화
2. 객체 내부에서 자동으로 바뀌지 않고, 클라이언트가 전략을 설정해야 한다.
즉 상태패턴은 객체가 자동으로 상태를 바꾸는 것이고 전략패턴은 객체를 사용자가 전략을 변경한다고 생각이 든다.
'개발 TIL' 카테고리의 다른 글
내일배움캠프TIL 45일차 프로젝트 세팅 (0) | 2025.03.27 |
---|---|
내일배움캠프TIL 44일차 배운내용 (0) | 2025.03.26 |
내일배움캠프 42일차 TIL 트러블 슈팅 (0) | 2025.03.24 |
내일배움캠프 41일차 TIL 재생성 스크롤 시도 (0) | 2025.03.21 |
내일배움캠프 40일차 TIL 배운내용 (0) | 2025.03.20 |