본문 바로가기
유니티 공부/C# 문법

C# - 상태 패턴(State Pattern)

by 코딩하는 돼징 2024. 5. 7.
반응형

상태 패턴이란?

객체 자신의 내부 상태에 따라 행위를 변경하도록 하는 패턴이다. 즉 객체의 특정 상태를 클래스로 선언하고 해당 상태에서 할 수 있는 행위들을 메소드로 정의한다. 그리고 이러한 상태클래스를 인터페이스로 캡슐화하여 클라이언트에서 인터페이스로 호출하는 방식으로 사용한다.

 

상태 패턴 구조

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EC%83%81%ED%83%9CState-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

 

State인터페이스 : 상태를 추상화한 고수준 모듈

ConcreteState : 구체적인 각각의 상태를 클래스로 표현

Context : State를 이용하는 시스템, 시스템 상태를 나타내는 State 객체를 합성하여 가지고 있다. 클라이언트로부터 요청받으면 State객체에 행위 실행을 위임한다.


코드 예시

상태 패턴을 사용하는 경우

using System;

// 상태 인터페이스
public interface IState
{
    void Handle(Context context);
}

// 구체적인 상태: 정상 상태
public class NormalState : IState
{
    public void Handle(Context context)
    {
        Console.WriteLine("플레이어는 현재 정상 상태입니다.");
    }
}

// 구체적인 상태: 공격 상태
public class AttackState : IState
{
    public void Handle(Context context)
    {
        Console.WriteLine("플레이어는 현재 공격 상태입니다.");
    }
}

// 컨텍스트 클래스
public class Context
{
    private IState currentState;

    public Context()
    {
        currentState = new NormalState();
    }

    public void SetState(IState state)
    {
        currentState = state;
    }

    public void Request()
    {
        currentState.Handle(this);
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 컨텍스트 객체 생성
        Context context = new Context();

        // 현재 상태 출력
        context.Request();

        // 상태 변경
        context.SetState(new AttackState());
        // 변경된 상태 출력
        context.Request();
    }
}

 

상태 패턴을 사용하지 않는 경우

using System;

// 플레이어 클래스
public class Player
{
    private bool isAttacking = false;

    public void Attack()
    {
        isAttacking = true;
        Console.WriteLine("플레이어는 현재 공격 상태입니다.");
    }

    public void Normal()
    {
        isAttacking = false;
        Console.WriteLine("플레이어는 현재 정상 상태입니다.");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 플레이어 객체 생성
        Player player = new Player();

        // 현재 상태 출력
        player.Normal();

        // 상태 변경
        player.Attack();
    }
}

장점 

상태에 따른 동작을 개별 클래스로 옮겨서 관리 가능단일 책임 원칙, 개방 폐쇄 원칙을 준수

 

단점

상태 별로 클래스를 생성하므로 관리해야할 클래스 수 증가

 

전략 패턴과 상태패턴 차이

전략 패턴이 전략 알고리즘을 클래스로 표현한 패턴이라면 상태 패턴은 객체 상태를 클래스로 표현한 패턴이라고 보면 된다.

그러므로 전략 패턴은 동적으로 변경가능한 알고리즘을 처리하는데 주로 사용되며 알고리즘이 서로 독립적인 경우에 사용하는 것이 적합하고 상태 패턴의 경우에는 객체의 상태에 따라 행동이 변하는 경우 사용하는게 적합하다.

 

 

반응형

댓글