State Pattern(상태 패턴)은 객체가 특정 상태에 따라 행위를 달리하는 상황에서, 상태를 조건문으로 검사해서 행위를 달리하는 것이 아닌, 상태를 객체화 하여 상태가 행동을 할 수 있도록 위임하는 패턴을 말한다.
객체 지향 프로그래밍에서의 클래스는 꼭 사물 / 생물만을 표현하는 고체 형태의 데이터만 표현 할 수있는게 아니다. 경우에 따라서 무형태의 행위 / 동작도 클래스로 묶어 표현할 수 있다.
그래서 상태를 클래스로 표현하면 클래스를 교체해서 '상태의 변화'를 표현할 수 있고, 객체 내부 상태 변경에 따라 객체의 행동을 상태에 특화된 행동들로 분리해 낼 수 있으며, 새로운 행동을 추가하더라도 다른 행동에 영향을 주지 않는다.
상태이란?
객체가 가질 수 있는 어떤 조건이나 상황을 의미한다.
예를 들어 티비가 켜져 있는 상태라면 음량 버튼을 누르면 음량이 증가하거나 감소한다. 하지만 티비가 꺼져 있는 상태라면 음량버튼을 아무리 눌러도티비의 음량은 바뀌지 않는다. 즉, 티비 전원의 상태에 따라 메소드 행동이 바뀌는 것이다. 이 처럼 객체가 특정 상태에 따라 행위를 달리하는 상황에서 사용되는 최적의 패턴이 State Patter이다.
각 상태들, On, Off, Saving 상태를 클래스로 정의하고, 이들을 하나의 인터페이스로 묶습니다. 그리고나서 Laptop이 상태 인터페이스의 메서드를 호출하면 각 상태 클래스에서 정의된 행위가 수행되는 방식입니다.
public interface PowerState {
public void powerPush();
}
public class On implements PowerState{
public void powerPush(){
System.out.println("전원 off");
}
}
public class Off implements PowerState {
public void powerPush(){
System.out.println("절전 모드");
}
}
public class Saving implements PowerState {
public void powerPush(){
System.out.println("전원 on");
}
}
public class Laptop {
private PowerState powerState;
public Laptop(){
this.powerState = new Off();
}
public void setPowerState(PowerState powerState){
this.powerState = powerState;
}
public void powerPush(){
powerState.powerPush();
}
}
public class Client {
public static void main(String args[]){
Laptop laptop = new Laptop();
On on = new On();
Off off = new Off();
Saving saving = new Saving();
laptop.powerPush();
laptop.setPowerState(on);
laptop.powerPush();
laptop.setPowerState(saving);
laptop.powerPush();
laptop.setPowerState(off);
laptop.powerPush();
laptop.setPowerState(on);
laptop.powerPush();
}
}
State Pattern을 활용하여 만든 방식이며 주로 컴파일러, 임베디드, 게임 캐릭터(몬스터) AI에 자주 사용된다.
State Machin은 흔히들 여러 이름으로 불린다.
State Machine(상태 기계), Finite State Machine(유한 상태 기계), Finite Automation(유한 오토마톤), Finite Automata(무한 오토마타), 등등..
State Machin은 Finite, 유한 개의 State로 구성된 Finite State Machine과 Infinite, 무한 개의 State로 구성되는 Infinite State Machine으로 나뉜다.