본문 바로가기
Programming

[Java] 상태 패턴(State Pattern)이란?

by BTC_젤리요정 2023. 9. 27.

베하~

안녕하세요! 블랙아웃입니다!

 

오늘은 객체 지향 디자인 패턴 중 하나인 상태 패턴에 대해 알아보겠습니다. 상태 패턴을 이용하면 객체의 내부 상태에 따라서 객체의 행동을 변경할 수 있게 되어 코드의 유연성과 확장성이 향상됩니다.


1. 상태 패턴 개념

상태 패턴은 객체가 내부 상태에 따라 여러 행동 중 하나를 선택할 수 있도록 하는 패턴입니다. 이를 통해 객체는 내부 상태가 바뀌어도 클래스를 바꾸지 않고도 다른 행동을 할 수 있습니다. 상태 패턴은 주로 유한 상태 머신(Finite State Machine, FSM)을 구현할 때 사용됩니다.

 

왜 상태 패턴이 필요한가요?

  • 코드의 복잡성 감소: 상태에 따른 조건문이 많아지면 코드의 복잡성이 증가합니다. 상태 패턴은 상태를 객체로 분리함으로써 이러한 복잡성을 줄일 수 있습니다.
  • 유연성과 확장성 증가: 새로운 상태가 추가되어도 기존 코드의 수정 없이 확장할 수 있습니다.

 

2. 상태 패턴 구조

상태 패턴은 주로 세 부분으로 이루어집니다.

  1. Context 클래스: 현재 상태를 저장하고, 상태에 따라 행동이 변하는 클래스입니다.
  2. State 인터페이스: 모든 상태 클래스가 구현해야 하는 인터페이스입니다.
  3. ConcreteState 클래스들: State 인터페이스를 구현하는 실제 상태 클래스들입니다.

 

3. 상태 패턴의 활용 예제

간단한 예제를 통해 상태 패턴의 구조와 활용을 살펴보겠습니다.

// State 인터페이스
interface State {
    void handle(Context context);
}

// ConcreteState 클래스들
class StateA implements State {
    @Override
    public void handle(Context context) {
        System.out.println("State A handling");
        context.setState(new StateB());
    }
}

class StateB implements State {
    @Override
    public void handle(Context context) {
        System.out.println("State B handling");
        context.setState(new StateA());
    }
}

// Context 클래스
class Context {
    private State state;

    public Context(State state) {
        this.state = state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public void request() {
        state.handle(this);
    }
}

public class StatePatternExample {
    public static void main(String[] args) {
        Context context = new Context(new StateA());
        context.request(); // State A handling
        context.request(); // State B handling
    }
}

이 예제에서는 Context 클래스가 상태를 바꾸면서 서로 다른 행동을 보이는 것을 확인할 수 있습니다.

 

4. 상태 패턴의 장단점

장점

  1. 상태에 따른 행동 변경이 명확해집니다.
  2. 새로운 상태 추가가 용이합니다.
  3. 코드의 유지보수가 편리해집니다.

단점

  1. 클래스의 개수가 많아질 수 있습니다.
  2. 디자인이 초반에 잘 되어있지 않다면 나중에 수정이 어려울 수 있습니다.

 

5. 상태 패턴과 전략 패턴의 차이점

상태 패턴과 전략 패턴은 유사해 보이지만, 목적과 사용 케이스에서 차이가 있습니다. 상태 패턴은 객체의 상태에 따라 동적으로 행동을 변경할 때 사용하고, 전략 패턴은 알고리즘의 변형을 캡슐화하여 교체 가능하게 할 때 사용합니다.


결론

상태 패턴은 특정 상황에서 객체의 행동을 유연하게 변경해야 할 때 유용한 패턴입니다. 하지만, 모든 상황에 적합한 것은 아니므로, 상황에 따라 적절한 패턴을 선택해야 합니다.

 

이상으로 상태 패턴에 대한 포스팅을 마치겠습니다.

감사합니다!

댓글