Hello

[디자인 패턴] - State

by 볼빵빵오춘기

State

객체의 내부 상태에 따라 객체의 행동이 바뀌도록 설계하는 패턴.
즉, 상태가 바뀌면 객체의 행위(메서드 결과)도 달라진다.

마치 if-else나 switch 문으로 상태별 행동을 구현하는 대신, 상태를 클래스로 추출해서 각 상태마다 행동을 정의한다.

 

예시 코드

// 상태 인터페이스
interface State {
void handle();
}
// 구체적인 상태
class OnState implements State {
public void handle() {
System.out.println("전원이 켜졌습니다.");
}
}
class OffState implements State {
public void handle() {
System.out.println("전원이 꺼졌습니다.");
}
}
// Context (상태를 갖는 객체)
class PowerSwitch {
private State state;
public PowerSwitch(State state) {
this.state = state;
}
public void setState(State state) {
this.state = state;
}
public void pressButton() {
state.handle();
}
}
// 사용 예시
public class StatePatternExample {
public static void main(String[] args) {
PowerSwitch power = new PowerSwitch(new OffState());
power.pressButton(); // 꺼진 상태
power.setState(new OnState());
power.pressButton(); // 켜진 상태
}
}

 

State 패턴의 장점

코드가 깔끔해짐

if-else나 switch문 없이 상태 전환을 객체로 분리 가능하다.

 

상태 전환이 명확해짐

각 상태 객체가 다음 상태를 직접 관리하므로 전환이 자연스럽다.

 

단일 책임 원칙(SRP)

각 상태 클래스가 자신이 해야 할 일을 독립적으로 관리한다.

 

확장성

새로운 상태를 추가해도 기존 코드 수정이 거의 없다.

 

State 패턴의 단점

상태 클래스가 많아짐

상태가 많을수록 클래스 파일이 많아짐 (복잡도 ↑)

 

상태 관리 어려움

상태 간의 전환 흐름이 복잡해지면 설계가 까다로워짐

 

설정 비용

작은 상태 변화에는 과한 패턴일 수 있음

 

State 패턴은 언제 사용하나?

객체가 다양한 상태에 따라 행동이 바뀔 때

ex) 문 상태 (열림/닫힘/잠김), 게임 캐릭터 상태 (대기/공격/피격 등)

 

if-else/switch가 너무 많을 때

ex) 상태별 처리 코드가 길어져서 유지보수가 어려운 경우

 

UI/UX 상태 흐름 관리

버튼 상태, 입력창 활성/비활성 등 GUI 컨트롤 관리 시

 

정리하자면

State 패턴은 객체의 상태를 캡슐화하여, 상태에 따른 동작을 클래스 수준에서 분리하고,
상태 전환과 행동 변경을 유연하게 처리할 수 있도록 도와주는 디자인 패턴이다.

 

 

 

블로그의 프로필 사진

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기