JAVA/JAVA Design Pattern

JAVA 상태(State) 패턴

임베디드 친구 2025. 1. 4. 12:14
반응형

1. 상태 패턴이란?

상태(State) 패턴은 객체의 상태에 따라 그 객체의 행동(Behavior)을 변경하는 방법을 제공하는 디자인 패턴입니다. 객체의 상태가 바뀜에 따라 동일한 메서드 호출에서도 서로 다른 동작을 수행하게 됩니다.

이 패턴은 상태를 클래스로 분리하고 각 상태 클래스에서 특정 상태에 맞는 행동을 구현함으로써 조건문 분기를 제거하고 코드의 유연성을 높이는 데 기여합니다.

2. 상태 패턴의 특징

  • 상태 독립성: 각 상태는 서로 독립적으로 구현되며, 서로 다른 상태로 전환할 수 있습니다.
  • 유지보수 용이: 상태 추가/변경 시 기존 코드를 수정하지 않고 새로운 상태 클래스를 추가할 수 있습니다.
  • 가독성 향상: 복잡한 조건문 대신 상태 객체를 활용하여 코드의 가독성을 높입니다.

3. 상태 패턴의 클래스 다이어그램

         +----------------------+
         |    Context           |
         +----------------------+
         | - state: State       |
         +----------------------+
         | + request()          |
         | + setState(s: State) |
         +----------------------+
                 |
                 v
         +----------------+
         |     State      |<-------------------+
         +----------------+                    |
         | + handle()     |                    |
         +----------------+                    |
                 ^                             |
                 |                             |
  +-----------------------+      +-----------------------+
  |  ConcreteStateA       |      |  ConcreteStateB       |
  +-----------------------+      +-----------------------+
  | + handle(): void      |      | + handle(): void      |
  +-----------------------+      +-----------------------+

4. 상태 패턴의 실제 사용 사례: 상태 전이 시스템

상태 패턴은 자동판매기, 게임 캐릭터의 상태 전이, 문서의 승인 단계와 같은 상태 변화가 있는 시스템에서 자주 사용됩니다.

예를 들어, 간단한 문서 승인 시스템에서는 문서의 상태가 Draft, UnderReview, Approved로 전이될 수 있습니다. 각 상태에서는 특정 동작이 정의되며 상태가 변경될 때 그에 맞는 동작을 수행합니다.


5. 예제 코드: 상태 패턴 구현

다음은 간단한 문서 상태 전이 시스템의 상태 패턴 예제입니다.

// State 인터페이스
interface State {
    void handleRequest();
}

// ConcreteStateA: Draft 상태
class DraftState implements State {
    @Override
    public void handleRequest() {
        System.out.println("문서가 초안 상태입니다. 수정이 가능합니다.");
    }
}

// ConcreteStateB: UnderReview 상태
class UnderReviewState implements State {
    @Override
    public void handleRequest() {
        System.out.println("문서가 검토 중입니다. 수정이 불가능합니다.");
    }
}

// ConcreteStateC: Approved 상태
class ApprovedState implements State {
    @Override
    public void handleRequest() {
        System.out.println("문서가 승인되었습니다. 최종 문서입니다.");
    }
}

// Context: 상태를 관리하는 문서 클래스
class Document {
    private State state;

    public Document() {
        this.state = new DraftState(); // 초기 상태 설정
    }

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

    public void request() {
        state.handleRequest();
    }
}

// Main 클래스: 상태 패턴 동작 확인
public class StatePatternExample {
    public static void main(String[] args) {
        Document document = new Document();

        System.out.println("현재 상태: Draft");
        document.request(); // Draft 상태의 동작

        System.out.println("상태를 UnderReview로 변경");
        document.setState(new UnderReviewState());
        document.request(); // UnderReview 상태의 동작

        System.out.println("상태를 Approved로 변경");
        document.setState(new ApprovedState());
        document.request(); // Approved 상태의 동작
    }
}

6. 코드 실행 결과

현재 상태: Draft
문서가 초안 상태입니다. 수정이 가능합니다.
상태를 UnderReview로 변경
문서가 검토 중입니다. 수정이 불가능합니다.
상태를 Approved로 변경
문서가 승인되었습니다. 최종 문서입니다.

7. 결론

상태(State) 패턴은 객체의 상태에 따라 서로 다른 동작을 수행해야 하는 경우 유용하게 사용할 수 있는 디자인 패턴입니다. 조건문으로 인해 코드가 복잡해지는 문제를 해결하고 상태별 동작을 독립적으로 관리할 수 있어 유지보수성과 확장성을 높입니다.

이 패턴은 문서의 상태 전이 시스템, 게임 캐릭터 상태 관리, 자동판매기 등 다양한 상황에서 활용할 수 있습니다.


참고 자료

반응형