반응형

 

안녕하세요 취업길잡이 Coy입니다

오늘은 상태 패턴(State Pattern)에 대해서 알아보도록 하겠습니다

 

상태 패턴이란

상태 패턴(State Pattern)은 객체가 특정 상태에 따라 행위를 다르게 하는 디자인 패턴으로, 상태를 객체화하여 객체의 행동을 상태에 따라 다르게 할 수 있도록 위임하는 방식을 채택합니다.

이는 객체의 내부 상태를 클래스로 표현하고, 해당 상태에 따른 행위를 클래스 내 메서드로 정의합니다.

상태 클래스는 인터페이스로 캡슐화되어 상태의 변화에 따라 객체의 행동이 상태에 특화된 행동으로 분리되며, 새로운 행동 추가 시 다른 행동에 영향을 주지 않습니다.

이 패턴은 상태 전이를 관리하는 복잡한 조건 로직을 분산시키고, 객체가 스스로 행동을 변경할 수 있도록 함으로써 설계를 단순화합니다.

 
 

 

사용하는 목적

  1. 다양한 상태에 따라 객체의 동작을 변화시킬 때: 객체가 특정 상태에 있을 때마다 다른 행동을 해야 할 때 상태 패턴을 사용합니다.
  2. 대규모 조건 분기 코드와 중복 코드를 간소화할 때: 상태 및 전환에 걸쳐 많은 조건 분기 코드와 중복 코드가 존재할 때, 이를 간소화하고 유지보수성을 향상시키기 위해 상태 패턴을 활용합니다.
  3. 런타임에 객체의 상태를 동적으로 변경해야 할 때: 객체의 상태가 런타임 중에 변경되어야 하는 경우, 상태 패턴을 사용하여 객체의 행동을 유연하게 조절할 수 있습니다.
  4. 상태 클래스들의 계층구조를 구성하고 중복 코드를 줄일 때: 상태 클래스들 간에 계층구조를 구성하여 공통 코드를 추상화하고 중복을 최소화하는 경우에 상태 패턴을 활용합니다.

 

 

구조

 

 

 

 

예제 코드

// State.java
public interface State {
    void handle();
}

 

// ConcreteStateA.java
public class ConcreteStateA implements State {
    @Override
    public void handle() {
        System.out.println("Handling request in State A");
    }
}

// ConcreteStateB.java
public class ConcreteStateB implements State {
    @Override
    public void handle() {
        System.out.println("Handling request in State B");
    }
}
// Context.java
public class Context {
    private State state;

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

    public void request() {
        state.handle();
    }
}
public class Main {
    public static void main(String[] args) {
        // 초기 상태 설정
        Context context = new Context();
        State stateA = new ConcreteStateA();
        context.setState(stateA);

        // 상태 A에서의 동작
        context.request();  // 출력: Handling request in State A

        // 상태 B로 전환
        State stateB = new ConcreteStateB();
        context.setState(stateB);

        // 상태 B에서의 동작
        context.request();  // 출력: Handling request in State B
    }
}

 

 

 

Context 클래스

  • Context 클래스는 상태를 관리하며, 상태에 따라 특정 행동을 수행하는 메서드인 request()를 제공합니다. 상태는 State 인터페이스를 통해 관리되며, 클라이언트는 setState() 메서드를 사용하여 상태를 변경할 수 있습니다.

State 인터페이스 및 구체적인 상태 클래스들

  • State 인터페이스는 각 상태에서 구현해야 할 handle() 메서드를 정의하고, 구체적인 상태 클래스인 ConcreteStateA와 ConcreteStateB는 각각 상태에 맞는 특정 동작을 구현합니다. 클라이언트는 Context를 통해 상태를 설정하고 해당 상태에서의 동작을 호출할 수 있습니다.

 

 

상태 패턴의 장단점

 

장점

1. 모듈화 및 단일 책임 원칙 준수: 상태에 따른 행동을 개별 클래스로 모듈화하므로, 각 상태 클래스는 자체적으로 관리되고 수정될 수 있어 코드의 단일 책임 원칙을 준수하게 됩니다.

2. 코드 간소화와 유지보수 용이성: 각 상태 클래스가 특정 상태와 관련된 동작을 담당하므로, 코드가 간결하고 이해하기 쉽습니다. 새로운 상태의 추가나 기존 상태의 변경이 필요한 경우 해당 상태 클래스만 수정하면 되므로 유지보수가 용이합니다.

3. 개방 폐쇄 원칙 준수: 상태 패턴은 기존 코드 수정 없이 새로운 상태를 도입할 수 있어 개방 폐쇄 원칙을 준수하며, 확장에 열려있고 수정에 닫혀있는 유연한 설계를 가능하게 합니다.

 

단점 

1. 클래스 수 증가 및 복잡성: 상태 별로 클래스를 생성하므로 클래스 수가 증가하게 되고, 이로 인해 관리해야 할 클래스의 복잡성이 증가할 수 있습니다.

2. Context 코드 복잡성: 상태 클래스 갯수가 많거나 상태 규칙이 자주 변경된다면, Context 클래스의 상태 변경 코드가 복잡해질 수 있습니다.

3. 적은 상태 변경 또는 상태 수: 객체에 적용할 상태가 몇 가지 밖에 없거나 거의 상태 변경이 이루어지지 않는 경우, 패턴을 적용하는 것이 과도할 수 있으며, 오히려 불필요한 복잡성을 추가할 수 있습니다.

 

 

오늘 이렇게 상태 패턴에 대해서 알아보았습니다.

디자인 패턴 자체가 가독성을 좋게 하거나, 유지보수가 용이하게 해주는 것은 맞지만, 상황에 따라 잘 사용하는 것이 중요합니다

출처(https://m.yes24.com/Goods/Detail/17525598)


컬럼으로 다루어 주면 좋겠다 싶은 주제가 있으면 댓글로 알려주세요

 

도움이 필요하시면 사연을 메일로 보내주세요

 

jek300300@gmail.com

 

도움이 되셨다면 공감과 구독 부탁드립니다

 

읽어주셔서 감사합니다

 

당신의 취업이 성공할 때까지 같이 하겠습니다! by 취업길잡이 Coy

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기