1. 상태 패턴(State Pattern)
상태 패턴은 객체의 상태에 따라 행동을 해야하는 상황에서 객체 스스로 자신의 상태에 따른 행동을 하지 않고, 상태를 객체화하여 상태가 행동을 할 수 있게 위임한 패턴이다.

쉽게 말하면 상태를 Class에서 값으로 가지고 있는 것이 아니라, Class로 선언하고 해당 상태의 Class가 해야하는 행동을 메서드로 정의하고 이를 인터페이스로 캡슐화 후 호출하는 Class가 인터페이스를 호출하는 방식이다.
2. 사용 예시
자 그러면 Person Class를 이용해서 예시를 들어보자.
사람은 나이에 따라 상태를 child(어린이), Adult(청년), Senior(노년)으로 구별된다. 해당 상태에 따라서 움직인다라는 메서드를 사용 가능하고 움직이면 나이가 들다가 다시 어린이로 돌아가는 설정을 두고 살펴보자.
<java />
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을 이용하여 해결할 수 있다.
<java />
public interface PersonState {
void run();
}
<java />
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("노인은 느리게 달립니다.");
}
}
<java />
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 |