Search
🙊

스테이트 State

Intro::

디자인 패턴 중 행위 패턴인 스테이트에 대해 알아봅시다.

스테이트 패턴이란?

스테이트 패턴은 객체의 상태 변화에 따라 객체의 행동이 변경되도록 하는 디자인 패턴입니다. 즉, 객체의 내부 상태가 바뀜에 따라 객체의 행동이 다르게 작동할 수 있도록 합니다. 이 패턴을 사용하면 상태를 객체의 클래스로 캡슐화하고, 이를 통해 코드의 유지 보수를 용이하게 할 수 있습니다.

구성 요소

1.
Context (맥락): 사용자와 상호작용하는 주 객체로, 현재 상태를 유지하고 상태에 따라 행동이 변화합니다.
2.
State (상태): 여러 상태의 공통 인터페이스를 정의합니다. 각각의 구체적인 상태는 이 인터페이스를 구현합니다.
3.
ConcreteState (구체적인 상태): State 인터페이스를 구현한 클래스로, 특정 상태에 대한 행동을 정의합니다.

장점

상태에 따른 행동의 변경을 로컬화하여 관리할 수 있어, 상태 변경에 따른 코드 수정을 최소화합니다.
상태 추가가 용이하며, 기존 코드를 변경하지 않고 새로운 상태 클래스를 추가하기만 하면 됩니다.
상태 패턴을 사용함으로써 복잡한 조건문 대신 객체 지향적인 방법으로 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.

단점

상태가 많아질수록 관련 클래스도 늘어나, 시스템이 복잡해질 수 있습니다.
각 상태가 하나의 클래스로 표현되므로, 상태가 많은 경우 많은 수의 클래스가 필요할 수 있습니다.

코드 예시

// State 인터페이스 interface FanState { void pull(Fan fan); } // ConcreteState 클래스: Off class Off implements FanState { public void pull(Fan fan) { System.out.println("Turning to speed 1"); fan.setState(new Speed1()); } } // ConcreteState 클래스: Speed1 class Speed1 implements FanState { public void pull(Fan fan) { System.out.println("Turning to speed 2"); fan.setState(new Speed2()); } } // ConcreteState 클래스: Speed2 class Speed2 implements FanState { public void pull(Fan fan) { System.out.println("Turning off"); fan.setState(new Off()); } } // Context 클래스: Fan class Fan { private FanState state; public Fan() { state = new Off(); // 초기 상태 설정 } public void pull() { state.pull(this); } public void setState(FanState state) { this.state = state; } } // 사용 예 public class Main { public static void main(String[] args) { Fan fan = new Fan(); fan.pull(); // Turning to speed 1 fan.pull(); // Turning to speed 2 fan.pull(); // Turning off } }
Java
복사

References::