검수요청.png검수요청.png

상태패턴

해시넷
이동: 둘러보기, 검색

상태패턴(state pattern)은 객체 지향 방식으로 상태 기계를 구현하는 행위 소프트웨어 디자인패턴이다. 상태 패턴을 이용하면 상태 패턴 인터페이스의 파생 클래스로 각각의 상태를 구현하고 패턴의 슈퍼클래스에 의해 정의되는 메소드를 호출하여 상태 변화를 구현함으로써 상태 기계를 구현한다. 상태 패턴은 패턴의 인터페이스에 정의된 메소드들의 호출을 통해 현재의 전략을 전환할 수 있는 전략 패턴으로 해석할 수 있다.[1] 상태패턴은 객체가 특정 상태에 따라 행위를 달리하는 상황에서, 자신이 직접 상태를 체크하여 상태에 따라 행위를 호출하지 않고, 상태를 객체화 하여 상태가 행동을 할 수 있도록 위임한다. 객체의 특정 상태를 클래스로 선언하고, 클래스에서는 해당 상태에서 할 수 있는 행위들을 메소드로 정의한다. 이러한 각 상태 클래스들을 인터페이스캡슐화하여, 클라이언트에서 인터페이스를 호출하는 방식이다.[2]

개요[3][편집]

상태 패턴은 유연하고 재사용 가능한 객체 지향 소프트웨어를 설계하기 위해 반복되는 디자인 문제를 해결하는 방법, 즉 객체는 구현, 변경, 테스트, 재사용이 쉬워야 한다는 것을 기술하는, 잘 알려진 23가지 GoF 디자인 패턴들 중 하나이다.

상태 패턴은 두 가지 주요 문제를 해결하도록 설정된다.

  • 개체는 내부 상태가 변경될 때 동작을 변경해야한다.'
  • 상태에 따른 동작은 독립적으로 정의되어야한다. 즉, 새 상태를 추가하면 기존 상태의 동작에 영향을 주지 않는다.

클래스 내에서 직접 상태에 따른 동작을 구현하는 것은 클래스를 특정 동작에 커밋하고 나중에 클래스를 변경하지 않고 독립적으로 새 상태를 추가하거나 기존 상태의 동작을 변경할 수 없도록하기 때문에 융통성이 없다. 여기에서 패턴은 두 가지 솔루션을 설명한다.

  • 각 상태에 대한 상태 별 동작을 캡슐화하는 개별 (상태) 개체를 정의합니다. 즉, 상태 별 동작을 수행하기위한 인터페이스 (상태)를 정의하고 각 상태에 대한 인터페이스를 구현하는 클래스를 정의한다.
  • 클래스는 상태 별 동작을 직접 구현하는 대신 현재 상태 개체에 상태 별 동작을 위임한다.

이를 통해 상태 특정 동작이 구현되는 방식에 독립적인 클래스를 만들고 새 상태 클래스를 정의하여 새 상태를 추가할 수 있다. 클래스는 현재 상태 개체를 변경하여 런타임에 동작을 변경할 수 있다.

구조[편집]

구성 요소[4][편집]

설명

Context[편집]

객체의 상태를 정의하는데 사용되는 메소드를 정의하는 인터페이스다.

State[편집]

상태에 따른 동작을 정의하는 인터페이스다.

ConcreteState[편집]

State에서 정의된 메소드를 구현하는 클래스다.

예제[5][편집]

State Pattern_example
  • 1 단계: 인터페이스를 생성한다.
//State.java
public interface State {
   public void doAction(Context context);
}
  • 2 단계: 동일한 인터페이스를 구현하는 구체적인 클래스를 생성한다.
//GoState.java
public class StartState implements State {
	public void doAction(Context context) {
	System.out.println("Player is in start state");
	context.setState(this);	
	}
	public String toString(){
	return "Start State";
	}
}
//StopState.java
public class StopState implements State {
	public void doAction(Context context) {
	System.out.println("Player is in stop state");
	context.setState(this);
	}
	public String toString(){
	return "Stop State";
	}
}
  • 3 단계: 컨텍스트 클래스를 생성한다 .
//Context.java
public class Context {
	private State state;
	public Context(){
	state = null;
	}
	public void setState(State state){
	this.state = state;
	}
	public State getState(){
	return state;
	}
}
  • 4 단계: 컨텍스트를 사용하여 상태가 변경 될 때 동작의 변화를 확인한다.
//StatePatternDemo.java
public class StatePatternDemo {
	public static void main(String[] args) {
 	Context context = new Context();

	StartState startState = new StartState();
	startState.doAction(context);

	System.out.println(context.getState().toString());

 	StopState stopState = new StopState();
	stopState.doAction(context);

	System.out.println(context.getState().toString());
	}
}
  • 5 단계: 출력을 확인하면 다음과 같다.
Player is in start state
Start State
Player is in stop state
Stop State

특징[편집]

객체 상태에 따라 동일한 동작이라도 다른 처리를 해야할 때 사용한다. 보통 하나의 객체에 여러가지 상태가 존재할 때 조건문으로 결과를 처리하는데, 이때 신규 상태가 존재하면 기존 조건문을 다시 수정해야 한다. 객체의 상태를 클래스화하여 그것을 참조하는 식으로 소스코드의 변화를 최소화할 수 있다.[6]

장점[편집]

나의 객체에 대한 여러 동작을 구현해야할 때 상태 객체만 수정하므로 동작의 추가, 삭제 및 수정이 간단하다. State 패턴을 사용하면 객체의 상태에 따른 조건문(if/else, switch)이 줄어들어 코드가 간결해지고 가독성이 올라간다.[4]

단점[편집]

상태에 따른 조건문을 대신한 상태 객체가 증가하여 관리해야할 클래스의 수가 증가한다.[4]

각주[편집]

  1. 위키백과 , 〈상태 패턴〉, 《위키백과》, 2020-05-23
  2. victolee , 〈스테이트 패턴(State Pattern)〉, 《개인블로그》, 2018-12-15
  3. WIKIPEDIA , 〈State pattern〉, 《WIKIPEDIA》
  4. 4.0 4.1 4.2 TevQabs , 〈상태 패턴(State Pattern)〉, 《개인블로그》, 2019-02-15
  5. tutorialspoint , 〈Design Patterns - State Pattern〉, 《tutorialspoint》
  6. 건앤로즈 , 〈State Pattern〉, 《개인블로그》, 2012-09-11

참고자료[편집]

*건앤로즈 , 〈State Pattern〉, 《개인블로그》, 2012-09-11

같이 보기[편집]


  검수요청.png검수요청.png 이 상태패턴 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.