상태 패턴(State Pattern)
상태 패턴은 객체의 상태에 따라 행동을 해야하는 상황에서 객체 스스로 자신의 상태에 따른 행동을 하지 않고, 상태를 객체화하여 상태가 행동을 할 수 있게 위임한 패턴이다.
쉽게 말하면 상태를 Class에서 값으로 가지고 있는 것이 아니라, Class로 선언하고 해당 상태의 Class가 해야하는 행동을 메서드로 정의하고 이를 인터페이스로 캡슐화 후 호출하는 Class가 인터페이스를 호출하는 방식이다.
사용 예시
자 그러면 Person Class를 이용해서 예시를 들어보자.
사람은 나이에 따라 상태를 child(어린이), Adult(청년), Senior(노년)으로 구별된다. 해당 상태에 따라서 움직인다라는 메서드를 사용 가능하고 움직이면 나이가 들다가 다시 어린이로 돌아가는 설정을 두고 살펴보자.
public class Person {
public static final String CHILD = "CHILD";
public static final String ADULT = "ADULT";
public static final String SENIOR = "SENIOR";
public String age;
public Person() {
this.age = CHILD;
}
public void setAge(String age) {
this.age = age;
}
public void run() {
if (this.age.equals(CHILD)) {
System.out.println("아이는 달립니다.");
setAge(ADULT);
} else if (this.age.equals(ADULT)) {
System.out.println("어른은 빨리 달립니다.");
setAge(SENIOR);
} else if (this.age.equals(SENIOR)) {
System.out.println("노인은 느리게 달립니다.");
setAge(CHILD);
}
}
}
위의 코드는 Java로 구성된 코드이며, Person Class는 age를 상태로 가지며, run이라는 메서드가 구성되어있다.
보면 run 메서드 내부에서 age의 상태에 따라 if문을 이용해 분기처리하는 것을 볼 수 있는 데 이는 상태가 늘어나거나 상태에 따른 행위가 추가되어야할 때 코드가 점점 복잡해진다는 단점이 있다.
이를 State Pattern을 이용하여 해결할 수 있다.
public interface PersonState {
void run();
}
public class ChildState implements PersonState {
@Override
public void run() {
System.out.println("아이는 달립니다.");
}
}
public class AdultState implements PersonState {
@Override
public void run() {
System.out.println("어른은 빨리 달립니다.");
}
}
public class Senior implements PersonState {
@Override
public void run() {
System.out.println("노인은 느리게 달립니다.");
}
}
public class PersonContext {
PersonState personState;
void changeState(PersonState state) {
this.personState = state;
}
void run() {
this.personState.run();
changeState(new AdultState());
}
}
위의 코드를 보면 기존의 코드와 달리 상태를 값으로 관리하는 것이 아니라 Class로 관리하는 것을 볼 수 있다. 해당 행동을 호출할 클래스가 PersonState를 값으로 가지고 있고 run 메서드는 현재 상태의 run 메서드를 호출하는 식으로 관리하는 것을 볼 수 있다.
'CS > 자료구조' 카테고리의 다른 글
Observer Pattern (1) | 2024.06.02 |
---|---|
[자료 구조] Queue (0) | 2022.11.16 |
[자료 구조] Stack (0) | 2022.11.16 |
[CS] 진법에 대해 알아보자(1) (0) | 2022.08.14 |