minstudio

상태 패턴 (State)

상태 패턴(State Pattern)은 객체의 내부 상태가 바뀔 때, 객체의 행동(메서드 결과)도 함께 바뀌도록 하는 패턴입니다. 전략 패턴과 구조가 거의 같지만, 목적이 다릅니다.

전자레인지를 생각해봅시다. '정지 상태'에서 시작 버튼을 누르면 가열이 되지만, 이미 '가동 상태'에서 시작 버튼을 누르면 아무 일도 안 하거나 시간이 연장됩니다. 즉, 상태에 따라 if-else 지옥을 만드는 대신 상태 자체를 클래스로 분리하여 캡슐화합니다.

🚥 State: 상태에 따른 행동 변화 캡슐화 MicroOven (전자레인지) State currentState; onButton() -> state.on() StopState (정지 상태) on() -> 가열 시작 & 상태를 Run으로 변경 RunState (작동 상태) on() -> 가열 시간 30초 연장 PauseState (일시정지 상태) on() -> 재가동 & 상태를 Run으로 변경
// State
interface VendingMachineState {
    void insertCoin();
    void pushButton();
}

// Context
class VendingMachine {
    VendingMachineState noCoinState;
    VendingMachineState hasCoinState;
    
    VendingMachineState currentState;
    
    public VendingMachine() {
        noCoinState = new NoCoinState(this);
        hasCoinState = new HasCoinState(this);
        currentState = noCoinState; // 초기 상태
    }
    
    public void setState(VendingMachineState state) { this.currentState = state; }
    
    public void insertCoin() { currentState.insertCoin(); }
    public void pushButton() { currentState.pushButton(); }
}

class NoCoinState implements VendingMachineState {
    VendingMachine machine;
    public NoCoinState(VendingMachine machine) { this.machine = machine; }
    
    public void insertCoin() {
        System.out.println("동전을 넣었습니다.");
        machine.setState(machine.hasCoinState);
    }
    public void pushButton() {
        System.out.println("동전을 먼저 넣어주세요.");
    }
}

class HasCoinState implements VendingMachineState {
    VendingMachine machine;
    public HasCoinState(VendingMachine machine) { this.machine = machine; }
    
    public void insertCoin() {
        System.out.println("이미 동전이 있습니다.");
    }
    public void pushButton() {
        System.out.println("음료수가 나옵니다.");
        machine.setState(machine.noCoinState);
    }
}

public class Main {
    public static void main(String[] args) {
        VendingMachine machine = new VendingMachine();
        
        machine.pushButton(); // 동전을 먼저 넣어주세요.
        machine.insertCoin(); // 동전을 넣었습니다.
        machine.insertCoin(); // 이미 동전이 있습니다.
        machine.pushButton(); // 음료수가 나옵니다.
    }
}
상태 패턴 (State) | Minstudio