Tech Blog of Pinomaker
article thumbnail
Published 2024. 4. 13. 18:29
상대 패턴(State Pattern) CS/자료구조

1. 상태 패턴(State Pattern)

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

 

출처 : https://pharokeepers.github.io/pharo/2019/08/02/State-Design-Pattern.html

 

 쉽게 말하면 상태를 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
profile

Tech Blog of Pinomaker

@pinomaker

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!