베하~
안녕하세요! 블랙아웃입니다!
오늘은 객체 지향 디자인 패턴 중 하나인 상태 패턴에 대해 알아보겠습니다. 상태 패턴을 이용하면 객체의 내부 상태에 따라서 객체의 행동을 변경할 수 있게 되어 코드의 유연성과 확장성이 향상됩니다.
1. 상태 패턴 개념
상태 패턴은 객체가 내부 상태에 따라 여러 행동 중 하나를 선택할 수 있도록 하는 패턴입니다. 이를 통해 객체는 내부 상태가 바뀌어도 클래스를 바꾸지 않고도 다른 행동을 할 수 있습니다. 상태 패턴은 주로 유한 상태 머신(Finite State Machine, FSM)을 구현할 때 사용됩니다.
왜 상태 패턴이 필요한가요?
- 코드의 복잡성 감소: 상태에 따른 조건문이 많아지면 코드의 복잡성이 증가합니다. 상태 패턴은 상태를 객체로 분리함으로써 이러한 복잡성을 줄일 수 있습니다.
- 유연성과 확장성 증가: 새로운 상태가 추가되어도 기존 코드의 수정 없이 확장할 수 있습니다.
2. 상태 패턴 구조
상태 패턴은 주로 세 부분으로 이루어집니다.
- Context 클래스: 현재 상태를 저장하고, 상태에 따라 행동이 변하는 클래스입니다.
- State 인터페이스: 모든 상태 클래스가 구현해야 하는 인터페이스입니다.
- 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. 상태 패턴의 장단점
장점
- 상태에 따른 행동 변경이 명확해집니다.
- 새로운 상태 추가가 용이합니다.
- 코드의 유지보수가 편리해집니다.
단점
- 클래스의 개수가 많아질 수 있습니다.
- 디자인이 초반에 잘 되어있지 않다면 나중에 수정이 어려울 수 있습니다.
5. 상태 패턴과 전략 패턴의 차이점
상태 패턴과 전략 패턴은 유사해 보이지만, 목적과 사용 케이스에서 차이가 있습니다. 상태 패턴은 객체의 상태에 따라 동적으로 행동을 변경할 때 사용하고, 전략 패턴은 알고리즘의 변형을 캡슐화하여 교체 가능하게 할 때 사용합니다.
결론
상태 패턴은 특정 상황에서 객체의 행동을 유연하게 변경해야 할 때 유용한 패턴입니다. 하지만, 모든 상황에 적합한 것은 아니므로, 상황에 따라 적절한 패턴을 선택해야 합니다.
이상으로 상태 패턴에 대한 포스팅을 마치겠습니다.
감사합니다!
'Programming' 카테고리의 다른 글
Go 언어에서의 Receiver와 메서드 (0) | 2023.09.30 |
---|---|
패러다임에 따른 개발 언어의 분류와 특징 (0) | 2023.09.27 |
[Mybatis] resultMap과 resultType (0) | 2023.09.27 |
[Java] 빌더 패턴(Builder Pattern)의 이해와 활용 (0) | 2023.09.15 |
정규표현식 (0) | 2023.09.15 |
댓글