Post

상태 관리가 쉬워지는 State 패턴 구현 방법

State 패턴에 대해서 알아보자!


State pattern 은 어떤 클래스가 여러가지의 상태를 가질때 사용하기 좋은 패턴이다! 내가 지금 글을 쓰고있는 태블릿의 상태를 클래스로 나타내어보자! 이 태블릿은 전원 버튼이 있다! 해당 전원 버튼을 누를때마다 꺼져있는 상태라면 켜지고 켜져있는 상태면 꺼지는 동작을 한번 아래처럼 구현해 보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Tablet {
	public String currentState = "OFF";
	
	public setState(String state) {
		currentState = state;
	}

	public void pushPowerButton () {
		if (currentState.equals("ON")) {
			currentState = "OFF";
		} else if (currentState.equals("OFF")) {
			currentState = "ON";
		}
	}
}

이렇게 작성이 될 수 있다. 그런데 여기에서 만약 state가 점점 늘어난다면 pushPowerButton 내부의 if 문은 점점 복잡해 질것이다! 따라서 이러한 state를 따로 클래스로 빼는것이다!

State Pattern 을 코드로 직접 구현해보자


우선 아래처럼 State 를 클래스로 따로 만들어 준다. 그럼 따로 스테이트가 생기면 TabletState를 implement한 클래스만 하나더 만들어 주면 된다! 우선은 on, off 두개만 만들어보자!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public interface TabletState {
	public void powerPush();
}

public static class ON implements TabletState{  
    public static PowerState powerPush(){  
		return OFF;
    }  
}  

public static class OFF implements TabletState {  
    public static PowerState pushPowerButton(){  
		return ON;
    }  
}

그럼 이제 원래의 tablet class는 아래처럼 수정이 될 수 있다.

1
2
3
4
5
6
7
8
9
10
class Tablet {
	public static TabletState currentState = OFF;	
	public setState(TabletState state) {
		currentState = state;
	}

	public void pushPowerButton () {
		currentState = currentState.pushPowerButton();
	}
}

한눈에 보아도 훨씬 state 관리가 쉬워짐을 느낄수있다!!

어떤 상황에 사용하면 좋을까?


우선 새로운 상태가 생기더라도 클래스만 하나 더 생성하고 각자의 역할을 정비해주면 된다. 따로 if 문들의 향연을 보지 않아도 된다는 큰 장점이 있다! 이렇게 또 한곳에만 모여있으면 나 뿐만 아니라 다른사람들도 코드를 이해하기 쉬워진다!

하지만 지금처럼 power button만을 누른다면 사실 if 문이면 충분할수있다 하지만 현업에서는 그럴가능성이 매우 적으니까… 또 관리할 클래스가 점점 늘어나서 힘들긴 하지만 if문이 주르륵 있는거보다는 훨씬 유지하기가 쉽다!

This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.