
[Java] ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP) - 3. ๋์์ธ ํจํด์ด๋?
3) ๋์์ธ ํจํด์ด๋? ๐ง ๋ฐ๋ณต๋๋ ์ค๊ณ ๋ฌธ์ ์ ๋ํ ๊ฒ์ฆ๋ “์ด๋ฆ ์๋ ํด๋ฒ”์ ์นดํ๋ก๊ทธ์ฅ์ : ๊ณตํต ์ดํ ์ ๊ณต(์์ฌ์ํต↑), ์ฌ์ฌ์ฉ์ฑ↑, ์ ์ง๋ณด์์ฑ↑์ฃผ์: “ํจํด ์ ์ฉ์ ์ํด ๋ฌธ์ ๋ฅผ ์ต์ง๋ก
lxvxxu.tistory.com
๐งฉ ๋์์ธ ํจํด — ์คํ ์ดํธ(State) ํจํด
“๊ฐ์ฒด์ ๋ด๋ถ ์ํ์ ๋ฐ๋ผ ํ๋์ ๋ฐ๊พธ๋ ํจํด”
๐ฏ ํ์ต ๋ชฉํ
- ์ํ(State)์ ๋ฐ๋ผ ๊ฐ์ฒด์ ๋์์ ๋ค๋ฅด๊ฒ ํ๋ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ค.
- ์กฐ๊ฑด๋ฌธ(if/switch)์ ์ ๊ฑฐํ๊ณ , ์ํ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋ค.
๐ง ์คํ ์ดํธ ํจํด์ด๋?
Allow an object to alter its behavior when its internal state changes.
The object will appear to change its class.
โก๏ธ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๊ฐ ๋ฐ๋๋ฉด ํ๋๋ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ ๋ค.
๐ชซ ์์ 1 — ํ๊ด๋ฑ ์ํ ๊ด๋ฆฌ
โ๏ธ ๊ธฐ์กด ๋ฐฉ์
public class Light {
private static final int ON = 0;
private static final int OFF = 1;
private static final int SLEEP = 2;
private int state = OFF;
public void on_button_pushed() {
if (state == ON) { ... }
else if (state == SLEEP) { ... }
else { ... }
}
}
โ ๋ฌธ์ ์
- ์ํ๊ฐ ๋์ด๋ ์๋ก if๋ฌธ์ด ๋ณต์กํด์ง
- ์ํ ์ถ๊ฐ ์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์์ ํด์ผ ํจ
โ ํด๊ฒฐ์ฑ — ์ํ ์บก์ํ
interface LightState {
void on_button_pushed(Light light);
void off_button_pushed(Light light);
}
class ON implements LightState {
public void on_button_pushed(Light light) { System.out.println("๋ฐ์ ์์"); }
public void off_button_pushed(Light light) {
System.out.println("Light Off!");
light.setState(new OFF());
}
}
class OFF implements LightState {
public void on_button_pushed(Light light) {
System.out.println("Light On!");
light.setState(new ON());
}
public void off_button_pushed(Light light) { System.out.println("๋ฐ์ ์์"); }
}
class Light {
private LightState state = new OFF();
public void setState(LightState s) { state = s; }
public void on_button_pushed() { state.on_button_pushed(this); }
public void off_button_pushed() { state.off_button_pushed(this); }
}
โ
์ํ ์ถ๊ฐ๊ฐ ์ฌ์
โ
์กฐ๊ฑด๋ฌธ ์ ๊ฑฐ
โ
์ฝ๋ ๊ฐ๋
์ฑ ํฅ์
๐ฌ ์์ 2 — ๋ฝ๊ธฐ ๊ธฐ๊ณ(Gumball Machine)
๋ฌธ์ ์ํฉ
- ๋์ ํฌ์ , ์์ก์ด ํ์ , ์๋งน์ด ๋ฐฐ์ถ ๋ฑ ์ฌ๋ฌ ์ํ๊ฐ ์กด์ฌ
- ๊ธฐ์กด ์ฝ๋์์๋ if (state == ...) ๋ก ๋ชจ๋ ์ํ ์ ์ด
๐งฉ ์คํ ์ดํธ ํจํด ์ ์ฉ
- State ์ธํฐํ์ด์ค ์ ์
- ๊ฐ ์ํ๋ฅผ ํด๋์ค๋ก ๊ตฌํ (NoQuarterState, HasQuarterState, SoldState, SoldOutState)
- GumballMachine ์ ํ์ฌ ์ํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
public class GumballMachine {
State soldOutState, noQuarterState, hasQuarterState, soldState;
State state;
int count = 0;
public GumballMachine(int count) {
this.count = count;
soldOutState = new SoldOutState(this);
noQuarterState = new NoQuarterState(this);
hasQuarterState = new HasQuarterState(this);
soldState = new SoldState(this);
state = (count > 0) ? noQuarterState : soldOutState;
}
public void insertQuarter() { state.insertQuarter(); }
public void ejectQuarter() { state.ejectQuarter(); }
public void turnCrank() { state.turnCrank(); state.dispense(); }
void setState(State s) { this.state = s; }
}
๐ ๊ฒฐ๊ณผ
- ์ํ๋ณ ๋์์ด ๊ฐ ํด๋์ค์ ๋ถ๋ฆฌ๋์ด ๊ด๋ฆฌ ์ฉ์ด
- ์๋ก์ด ์ํ(WinnerState) ์ถ๊ฐ๋ ์ฝ๋ ์์ ๊ฑฐ์ ์์
๐ ๋ณด๋์ค ๊ธฐ๋ฅ — ๋น์ฒจ(Winner) ์ํ ์ถ๊ฐ
public class WinnerState implements State {
public void dispense() {
System.out.println("์ถํ๋๋ฆฝ๋๋ค! ์๋งน์ด 2๊ฐ๋ฅผ ๋๋ฆฝ๋๋ค!");
// ... ๋น์ฒจ ์ฒ๋ฆฌ ๋ก์ง
}
}
โก๏ธ ๊ธฐ์กด HasQuarterState์์ ๋๋ค ์กฐ๊ฑด ์ถ๊ฐ๋ก ์ฐ๊ฒฐ
๐ ์ ๋ฆฌ
| ํต์ฌ ๊ฐ๋ | ๊ฐ์ฒด์ ์ํ๋ฅผ ํด๋์ค๋ก ๋ถ๋ฆฌํ์ฌ ํ๋ ์ ์ด |
| ์ฅ์ | if๋ฌธ ์ ๊ฑฐ, ์ฝ๋ ๊ตฌ์กฐ ๋ช ํ, ํ์ฅ์ฑ ๋์ |
| ๋จ์ | ํด๋์ค ์ ์ฆ๊ฐ |
| ๋ํ ์์ | ํ๊ด๋ฑ ์ ์ด, ๋ฝ๊ธฐ ๊ธฐ๊ณ, ๊ฒฐ์ ๋จ๊ณ, ๊ฒ์ ์บ๋ฆญํฐ ํ๋ |