State Pattern

‍이시현·2023년 12월 7일
0

Design Pattern

목록 보기
6/6
post-thumbnail

종종 Finite State Machine이나 Markov Model 이런 것들을 보면 위처럼 상태 전이를 그래프로 표현한 그림을 볼 수 있다. State Pattern은 이러한 상태 전이 그래프를 나중에 상태가 추가되거나 간선이 추가되도 잘 유지보수 할 수 있도록 만든 패턴이다.

보통의 경우 위와 같은 그림을 코딩할 땐 하나의 간선을 하나의 함수로 만든 뒤 각 함수 안에선 if문으로 만약 현재 기계가 어떤 상태였다면 해당 함수가 맡은 행동을 어떻게 해야할지 정의하는 것이 일반적이다. 하지만 이렇게 코딩하면 나중에 상태가 하나 추가되면 모든 함수를 수정해야하는 번거로움이 존재하게 된다.

State Pattern에선 각 상태를 하나의 클래스에 대응시킨 뒤 각각의 클래스에서 간선에 해당하는 행동들을 정의시킨다. 행동함수 안에서 상태를 판단하는 구조에서 상태 클래스에서 행동을 구현하는 방식으로 뒤집은 것이다. 모든 클래스는 State라는 인터페이스를 상속받아 구현된다. 이 때 State는 상태그래프에서 정의된 모든 행동(간선)들을 추상 메소드로 가지고 있고 따라서 이를 구현하는 모든 클래스들은 이 행동들을 모두 정의해야한다.
이렇게 만든 State 클래스들을 Client 클래스가 멤버변수로 가진 뒤 간선에 해당하는 행동을 메소드로 만들어서 구현하면 된다. 행동을 함수로 만드는 행위가 이전과 똑같다고 생각할 수 있지만

public void insertQuarter(){
	state.insertQuarter();
}

이런식으로 구현하게 되면 state 변수는 State 타입이기 때문에 State 인터페이스를 상속한 모든 클래스들이 state 변수 인스턴스가 될 수 있는 것이다. 따라서 같은 이름의 함수를 불러도 state 상태에 따라 다른 행위를 하는 것이 가능해진다. 이런식으로 유지보수성을 높이는 것이다.
만약 추후에 새로운 상태가 추가된다면 새로운 클래스를 만들면되고 해당 클래스 안에서 State 인터페이스 안에 있는 메소드들을 정의하면 된다. 이 때 다른 상태에서 새로 만든 State로 전이가 필요한 경우 이러한 코드를 추가해야하긴 한다.

이렇게 상태패턴을 사용하면 객체의 내부 상태가 바뀜에 따라서 해당 객체의 행동을 바꿀 수 있고 이것은 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.

이 사진이 State Pattern의 대한 다이어그램이다. 이 다이어그램은 1장의 Strategy Pattern의 다이어그램과 똑같다고 한다. 하지만 용도가 다른 것이 차이이다. 상태 패턴에선 각 상태의 일련의 행동이 클래스로 캡술화되고 상황에 따라 Context 객체가 여러 상태 객체 중 한 객체에게 모든 행동을 맡기게 된다. 하지만 Strategy Pattern에선 클라이언트가 Context에게 어떤 전략 객체를 사용하지를 지정해준다는 것이 차이점이다. 한마디로 사용자가 사전에 지정해서 맘대로 이리저리 바꾸는게 Strategy Pattern이고 State Pattern은 복잡한 상태전이 논리구조를 하나의 Context클래스가 알아서 이 상태도 됐다가 저 상태도 됐다가 바뀌는 것이다.

profile
알고리즘과 머신러닝에 관심이 있는 평범한 공대생입니다!

0개의 댓글