State Pattern: 객체 상태로 행동 변화 구현 방법

상태 패턴: 객체의 내부 상태를 통해 행동 변화 구현

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

디자인 패턴

대상자

- 대상자: 객체 지향 프로그래밍 경험을 가진 개발자, 설계 패턴을 학습하고자 하는 중급 이상 개발자

- 난이도: 중급 이상 (상태 관리와 디자인 원칙에 대한 이해 필요)

핵심 요약

  • 상태에 따라 객체의 행동을 분리하는 상태 패턴은 복잡한 조건문을 제거하고 유지보수성을 향상시킴
  • 각 상태를 별도의 클래스로 분리하여 OCP(개방 폐쇄 원칙)SRP(단일 책임 원칙)를 준수
  • 예제: Student 클래스에서 PreparingState, ExamTakenState, PassedState로 상태별 행동을 구현

섹션별 세부 요약

  1. 문제 상황과 전통적 구현
  • 객체의 상태에 따라 행동이 변화하는 예시: 문서 상태, 주문 상태, 학생의 학업 단계
  • 전통적 구현의 문제점:

- 중복된 상태 검사 (if-else 조건문 반복)

- 복잡한 조건문 (메서드당 여러 분기 처리)

- 상태 전환 로직이 분산되어 있음

- 유지보수성 저하 (새로운 상태 추가 시 모든 메서드 수정 필요)

  1. 상태 패턴의 구현 방식
  • 상태 인터페이스 정의: StudentState 인터페이스를 통해 각 상태의 행동을 정의
  • 상태 클래스 분리: PreparingState, ExamTakenState, PassedState 클래스로 상태별 메서드 구현
  • 상태 전환 로직: receiveResults 메서드에서 setState()를 통해 상태 변경
  • Student 클래스 수정: state 필드를 통해 현재 상태를 참조하고, 메서드 호출을 위임
  1. 상태 패턴의 장점
  • 코드 정리: 복잡한 조건문 제거
  • 유지보수성 향상: 상태별 코드가 집중화됨
  • 확장성: 새로운 상태 추가 시 기존 코드 수정 없이 가능
  • SRP 준수: 각 상태 클래스가 단일 책임을 수행
  1. 상태 패턴 vs 전략 패턴 비교
  • 목적: 상태 패턴은 내부 상태 변화에 따라 행동 변경, 전략 패턴은 알고리즘 교체
  • 제어 방식: 상태 패턴은 상태가 전환을 스스로 처리, 전략 패턴은 클라이언트가 전략 선택
  • 관계: 상태는 서로 참조, 전략은 독립적
  1. 상태 패턴의 적합한 사용 시점
  • 객체의 행동이 상태에 따라 달라질 때
  • 상태 전환 규칙이 명확할 때
  • 복잡한 조건문을 제거하고자 할 때

결론

상태 패턴은 객체의 내부 상태에 따라 행동을 동적으로 변경하는 데 효과적이며, OCP와 SRP를 준수하고 유지보수성확장성을 높입니다. 복잡한 조건문을 제거하고, 각 상태를 별도의 클래스로 분리하여 코드 가독성테스트 용이성을 개선할 수 있습니다. 예시에서 Student 클래스를 통해 상태별 행동을 구현한 방식은 실무에서 상태 관리가 필요한 시스템(예: 주문 상태 관리, 사용자 로그인 상태)에 적용 가능합니다.