개요
상태 패턴을 짧게 요약하면 상태를 클래스로 표현하는 것이다. 객체의 상태를 클래스로 표현한다는 것이 잘 와닿지 않을 수 있는데, 아래 코드를 살펴보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public class Player {
public static final int NORMAL = 0;
public static final int TIRED = 1;
public static final int EXHAUSTED = 2;
private int state;
public Player() {
state = NORMAL;
}
public void run() {
if (state == NORMAL) {
System.out.println("빠르게 달립니다.");
state = TIRED; // 상태 변경
} else if (state == TIRED) {
System.out.println("느리게 달립니다.");
state = EXHAUSTED; // 상태 변경
} else if (state == EXHAUSTED) {
System.out.println("달릴 수 없습니다.");
}
}
}
|
cs |
Player에 또 다른 상태 Sleep이 추가되면 어떨까? 새로운 상태가 추가될 때 마다 코드를 수정해야 하는 번거로움이 있을 것이다. 이 코드에 상태 패턴을 적용해 보자.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
public class Player {
private State state;
public Player() {
state = new NormalState();
}
public void run() {
state.run(this);
}
public void setState(State state) {
this.state = state;
}
}
public interface State {
void run(Player player);
}
public class NormalState implements State {
public void run(Player player) {
System.out.println("빠르게 달립니다.");
player.setState(new TiredState());
}
}
public class TiredState implements State {
public void run(Player player) {
System.out.println("느리게 달립니다.");
player.setState(new ExhaustedState());
}
}
public class ExhaustedState implements State {
public void run(Player player) {
System.out.println("달릴 수 없습니다.");
}
}
|
cs |
위와 같이 상태 패턴이 적용되었다. 차이점을 알아보겠는가? 기존 코드를 수정해야 하는 번거로움 없이 State 인터페이스로부터 새로운 상태 클래스를 구현하여 추가만 하면 된다.
상태 패턴의 등장인물
State
상태를 나타내는 역할로, 상태마다 다르게 동작하는 API를 정의하여 상태에 의존한 동작을 하는 메소드 모음이 된다. 위 예시 코드에서는 State 인터페이스가 이 역할을 맡았다.
ConcreteState
구체적인 각각의 상태를 나타내는 역할로 State에서 정의된 API를 구체적으로 구현한다. 위 예시 코드에서 NormalState, TiredState, ExhaustedState가 이 역할을 맡아 run 메소드를 구현하고 있다.
Context
현재 상태를 나타내는 ConcreteState를 가지며, State 패턴 이용자에게 필요한 API를 정의한다. Player 클래스가 현재 상태 State를 가지고 있으며, setState를 통해 상태가 변화한다.
상태 패턴의 확장
상태 패턴에 대해 공부하다 보면 문득 이런 생각을 가질 수 있다. 객체가 가지는 상태 State는 어차피 하나만 생성될건데.. State 객체를 여러 개 가질 필요는 없지 않을까? State 객체가 독자적인 정보를 가지지 않는다면, 객체를 여럿 가질 필요는 전혀 없다. 즉, State 객체는 특정 객체의 행위를 각 상태에 따라 모아 놓은 것이므로 단순 함수 집합으로 간주해 버린다면, 싱글톤 패턴을 상태 패턴에 적용할 수 있다!! 싱글톤 패턴을 상태 패턴에 적용하면 메모리 절약, 객체의 일관성 유지 등과 같은 장점을 가질 것이다.
'CS > 객체지향설계 & 패턴' 카테고리의 다른 글
[객체지향설계 & 패턴] 데코레이터 패턴 (1) | 2025.05.29 |
---|---|
[객체지향설계 & 패턴] 전략 패턴 (1) | 2025.05.21 |
[객체지향설계 & 패턴] 템플릿 메소드 패턴 (1) | 2025.05.21 |
[객체지향설계 & 패턴] 메멘토 패턴 (0) | 2025.05.10 |
[객체지향설계 & 패턴] 프로토타입 패턴 (0) | 2025.05.10 |