[파이썬] 상태 패턴과 객체 상태 변화

상태 패턴은 객체의 동작을 상태에 따라 다르게 처리할 수 있는 디자인 패턴입니다. 객체의 내부 상태를 추상화하고, 상태에 따라 다른 동작이 실행되도록 합니다. Python은 다형성과 상속을 통해 이 패턴을 구현할 수 있습니다.

객체 상태 변화

객체는 여러 상태를 가질 수 있습니다. 예를 들어, 자동차 객체는 “시동”, “주행”, “정지” 등의 상태를 가질 수 있습니다. 이러한 상태는 객체가 수행할 수 있는 작업과 동작을 결정합니다. 객체의 상태는 주로 인스턴스 변수를 통해 나타내어지며, 객체의 메서드들은 이 상태를 참조하여 적절한 동작을 수행합니다.

상태 패턴 구현

Python에서 상태 패턴을 구현하기 위해서는 다음과 같은 구성 요소가 필요합니다:

  1. State (상태): 상태를 나타내는 추상 클래스 또는 인터페이스입니다. 각 상태는 객체의 메서드를 오버라이드하여 책임을 수행합니다.
  2. Concrete States (구체적인 상태들): State 클래스를 상속받은 구체적인 상태 클래스들입니다. 각 상태는 고유한 동작을 구현합니다.
  3. Context (상태를 가진 객체): 상태 객체를 가지고 있는 객체입니다. 상태 변화에 따라 현재 상태를 변경하고, 현재 상태에 따라 적절한 동작을 수행합니다.

다음은 Python에서 상태 패턴을 구현하는 간단한 예제 코드입니다:

class State:
    def change_state(self, context):
        pass

    def do_action(self, context):
        pass

class ConcreteStateA(State):
    def change_state(self, context):
        context.state = ConcreteStateB()

    def do_action(self, context):
        print("Doing action in state A")

class ConcreteStateB(State):
    def change_state(self, context):
        context.state = ConcreteStateA()

    def do_action(self, context):
        print("Doing action in state B")

class Context:
    def __init__(self):
        self.state = ConcreteStateA()

    def change_state(self):
        self.state.change_state(self)

    def do_action(self):
        self.state.do_action(self)

# 예제 실행
context = Context()

context.do_action()     # Output: Doing action in state A
context.change_state()
context.do_action()     # Output: Doing action in state B

위의 코드에서 State 클래스는 추상 클래스로, change_state() 메서드와 do_action() 메서드를 정의합니다. ConcreteStateA와 ConcreteStateB는 State 클래스를 상속받은 구체적인 상태 클래스로, 각각 고유한 change_state()와 do_action() 메서드를 구현합니다. Context 클래스는 상태 객체를 가지며, change_state() 메서드를 통해 상태를 변화시키고, do_action() 메서드를 통해 현재 상태에 따른 동작을 호출합니다.

이 예제 코드는 단순한 상태 패턴의 구현을 보여줍니다. 실제 프로젝트에서는 더 복잡한 상태 전이와 동작을 처리할 수 있도록 설계해야합니다.

결과

상태 패턴은 객체의 동작을 상태에 따라 다르게 처리할 수 있도록 하며, 객체의 상태 변화를 추상화하여 처리합니다. Python의 다형성과 상속을 활용하여 간단하게 구현할 수 있습니다. 이를 통해 유지보수성과 가독성을 향상시킬 수 있습니다.