๐จย 02. ์ต์ ๋ฒ ํจํด
โ๏ธย ๊ธฐ์ ๋ชจ๋ํฐ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์๋ณด๊ธฐ
Weather-O-Rama์ ์ฐจ์ธ๋ ์ธํฐ๋ท ๊ธฐ๋ฐ ๊ธฐ์ ์คํ ์ด์ ๊ตฌ์ถ ํ๋ก์ ํธ์ ํจ๊ปํ๊ฒ ๋์๋ค. ๊ธฐ์ ๋ชจ๋ํฐ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด 3๊ฐ์ง ์์๋ก ์ด๋ฃจ์ด์ง๋ค.
- ๊ธฐ์ ์คํ ์ด์ (์ค์ ๊ธฐ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๋ฌผ๋ฆฌ ์ฅ๋น)
- WeatherData ๊ฐ์ฒด (๊ธฐ์ ์คํ ์ด์ ์ผ๋ก๋ถํฐ ์ค๋ ์ ๋ณด๋ฅผ ์ถ์ ํ๋ ๊ฐ์ฒด)
- ์ฌ์ฉ์์๊ฒ ํ์ฌ ๊ธฐ์ ์กฐ๊ฑด์ ๋ณด์ฌ ์ฃผ๋ ๋์คํ๋ ์ด ์ฅ๋น
์๊ตฌ์ฌํญ์ WeatherData ๊ฐ์ฒด๋ก ํ์ฌ ์กฐ๊ฑด, ๊ธฐ์ ํต๊ณ, ๊ธฐ์ ์๋ณด 3๊ฐ์ง ํญ๋ชฉ์ ๋์คํ๋ ์ด ์ฅ๋น์์ ๊ฐฑ์ ํด ๊ฐ๋ฉด์ ๋ณด์ฌ ์ฃผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด์ผ ํ๋ค.
โ๏ธย WeatherData ํด๋์ค ์ดํด๋ณด๊ธฐ
1
2
3
4
5
6
7
8
9
// WeatherData
// ํ๊ธฐ 3๊ฐ์ง ๋ฉ์๋๋ ์จ๋, ์ต๋, ๊ธฐ์ ๊ฐ์ ๋ฆฌํดํ๋ ๋ฉ์๋์ด๋ค.
getTemperature()
getHumidity()
getPressure()
// ๊ธฐ์ ๊ด์ธก๊ฐ์ด ๊ฐฑ์ ๋ ๋๋ง๋ค ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
measurementsChanged()
ํ์ฌ ์กฐ๊ฑด, ๊ธฐ์ ํต๊ณ, ๊ธฐ์ ์๋ณด๋ฅผ ๋ณด์ฌ ์ฃผ๋ 3๊ฐ์ง ๋์คํ๋ ์ด๊ฐ ์ ๋ฐ์ดํธ ๋๋๋ก measurementsChanged()๋ฅผ ๋ฐ๊ฟ๋ณด์.
โ๏ธย ๊ตฌํ ๋ชฉํ
measurementsChanged() ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค WeatherData()์์ ๋์คํ๋ ์ด๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ค๋ ์ฌ์ค๊น์ง๋ ํ์ ํ๋ค. ๊ทธ๋ฌ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
- WeatherData() ํด๋์ค์๋ 3๊ฐ์ง ์ธก์ ๊ฐ(์จ๋, ์ต๋, ๊ธฐ์)์ ๊ฒํฐ ๋ฉ์๋๊ฐ ์๋ค.
- ์๋ก์ด ๊ธฐ์ ์ธก์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค measurementsChanged() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
- ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋์คํ๋ ์ด ์์ 3๊ฐ์ง๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- ํ์ฌ ์กฐ๊ฑด, ๊ธฐ์ ํต๊ณ, ๊ธฐ์ ์๋ณด
- ๋์คํ๋ ์ด๋ฅผ ์ ๋ฐ์ดํธํ๋๋ก measurementsChanged() ๋ฉ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
์ถ๊ฐ ๋ชฉํ
๋์ค์ ๊ธฐ์ ์คํ ์ด์ ์ด ์ฑ๊ณตํ๋ฉด ๋์คํ๋ ์ด๊ฐ ๋ ๋์ด๋ ์๋ ์๊ณ , ๋์คํ๋ ์ด๋ฅผ ์ถ๊ฐํ ์ ์๋ ๋ง์ผํ๋ ์ด์ค๊ฐ ๋ง๋ค์ด์ง ์๋ ์๋ค. ํ์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํด ๋ณด์.
- ํ์ฅ์ฑ: ์ฌ์ฉ์๊ฐ ๋ง์๋๋ก ๋์คํ๋ ์ด ์์๋ฅผ ๋ํ๊ฑฐ๋ ๋บ ์ ์๋๋ก ํ๋ค.
โ๏ธย ๊ธฐ์ ์คํ ์ด์ ์ฉ ์ฝ๋ ์ถ๊ฐํ๊ธฐ
์ฐ์ measurementsChanged() ๋ฉ์๋์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class WeatherData{
// ์ธ์คํด์ค ๋ณ์ ์ ์ธ
public void measurementsChanged(){
// WeatherData์ ์๋ ๊ฒํฐ ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ต์ ์ธก์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
// ๊ฐ ๊ฐ์ ์ ๋นํ ๋ณ์์ ์ ์ฅํ๋ค.
float temp = getTemperature();
float humidity = getHumidity();
float pressure = getPressure();
// ๊ฐ ๋์คํ๋ ์ด๋ฅผ ๊ฐฑ์ ํ๋ค.
// ์ต์ ์ธก์ ๊ฐ์ ์ ๋ฌํ๋ฉด์ ๊ฐ ๋์คํ๋ ์ด ํญ๋ชฉ์ update ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
currentConditionsDisplay.update(temp, humidity, pressure);
statisticsDisplay.update(temp, humidity, pressure);
forecastDisplay.update(temp, humidity, pressure);
}
// ๊ธฐํ ๋ฉ์๋
}
โ๏ธย ์์น์ผ๋ก ์ถ๊ฐ ์ฝ๋ ์ดํด๋ณด๊ธฐ
1
2
3
currentConditionsDisplay.update(temp, humidity, pressure);
statisticsDisplay.update(temp, humidity, pressure);
forecastDisplay.update(temp, humidity, pressure);
ํด๋น ์ฝ๋์ ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๋ฐํ์ผ๋ก ์ฝ๋ฉํ๊ณ ์๋ค.
- ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๋ง์ถฐ์ ์ฝ๋ฉํ์ผ๋ฏ๋ก ํ๋ก๊ทธ๋จ์ ๊ณ ์น์ง ์๊ณ ๋ ๋ค๋ฅธ ๋์คํ๋ ์ด ํญ๋ชฉ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ค.
- ์๋ก์ด ๋์คํ๋ ์ด ํญ๋ชฉ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ์คํ ์ค์ ๋์คํ๋ ์ด ํญ๋ชฉ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ค.
- ๋ฐ๋๋ ๋ถ๋ถ์ ์บก์ํํ์ง ์์๋ค.
- ์๊ธฐ ๋ถ๋ถ์ ๋ฐ๋ ์ ์๋ ๋ถ๋ถ์ผ๋ก ์บก์ํํด์ผ ํ๋ค.
- ๋ชจ๋ ์จ๋, ์ต๋, ๊ธฐ์ ๊ฐ์ ๋ฐ์๋ค์ด๋ update() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
โ๏ธย ์ต์ ๋ฒ ํจํด ์ดํดํ๊ธฐ
์ ๋ฌธ์ด๋ ์ก์ง๋ฅผ ๊ตฌ๋ ํ๋ ๋ฉ์ปค๋์ฆ์ ๋ํด ์๊ฐํด ๋ณด์.
- ์ ๋ฌธ์ฌ๊ฐ ์ฌ์ ์ ์์ํ๊ณ ์ ๋ฌธ์ ์ฐ์ด๋ธ๋ค.
- ๋ ์๊ฐ ํน์ ์ ๋ฌธ์ฌ์ ๊ตฌ๋ ์ ์ฒญ์ ํ๋ฉด ๋งค๋ฒ ์๋ก์ด ์ ๋ฌธ์ด ๋์ฌ ๋๋ง๋ค ๋ฐฐ๋ฌ์ ๋ฐ์ ์ ์๋ค. ๊ตฌ๋ ์ ํด์งํ๊ธฐ ์ ๊น์ง ์ ๋ฌธ์ ๊ณ์ ๋ฐ์ ์ ์๋ค.
- ์ ๋ฌธ์ ๋ ์ด์ ๋ณด๊ณ ์ถ์ง ์์ผ๋ฉด ๊ตฌ๋ ํด์ง ์ ์ฒญ์ ํ๋ค. ๊ทธ๋ฌ๋ฉด ๋์ด์ ์ ๋ฌธ์ด ์ค์ง ์๋๋ค.
- ์ ๋ฌธ์ฌ๊ฐ ๋งํ์ง ์๋ ์ด์ ๊ฐ์ธ, ํธํ , ํญ๊ณต์ฌ ๋ฐ ๊ธฐํ ํ์ฌ ๋ฑ์ ๊พธ์คํ๊ฒ ์ ๋ฌธ์ ๊ตฌ๋ ํ๊ฑฐ๋ ํด์งํ๋ค.
์ ๋ฌธ์ฌ + ๊ตฌ๋ ์ = ์ต์ ๋ฒ ํจํด
์ ๋ฌธ์ฌ๋ฅผ ์ฃผ์ (subject), ๊ตฌ๋ ์๋ฅผ ์ต์ ๋ฒ(observer)๋ผ๊ณ ๋ถ๋ฅธ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
โ๏ธย ์ต์ ๋ฒ ํจํด์ ์๋ ์๋ฆฌ
- ์ค๋ฆฌ ๊ฐ์ฒด๊ฐ ๋ฑ์ฅํด์ ์ฃผ์ ํํ
์๊ธฐ๋ ์ต์ ๋ฒ๊ฐ ๋๊ณ ์ถ๋ค๊ณ ์ด์ผ๊ธฐ ํ๋ค.
- ์ฃผ์ ์์ ์ํ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ณด๋ด ์ฃผ๋ int ๊ฐ์ ์ ๋ง ๊ด์ฌ์ด ๋ง์๋ ์ค๋ฆฌ๋ ์ ๋ง๋ก ์ต์ ๋ฒ๊ฐ ๋๊ณ ์ถ๋ค.
- ์ค๋ฆฌ ๊ฐ์ฒด๋ ์ ์ ์ต์ ๋ฒ๊ฐ ๋๋ค.
- ์ค๋ฆฌ๋ ๊ตฌ๋ ์ ๋ชฉ๋ก์ ์ด๋ฆ์ ์ฌ๋ฆฌ๊ณ ๋ค์์ ์ ๋ฌ๋ int ๊ฐ์ ์ ํ๊ฒ ๊ธฐ๋ค๋ฆฐ๋ค.
- ์ฃผ์ ๊ฐ์ด ๋ฐ๋์๋ค.
- ์ค๋ฆฌ๋ฅผ ๋น๋กฏํ ๋ชจ๋ ์ต์ ๋ฒ๊ฐ ์ฃผ์ ๊ฐ์ด ๋ฐ๋์๋ค๋ ์ฐ๋ฝ์ ๋ฐ๋๋ค.
- ์ฅ ๊ฐ์ฒด๊ฐ ์ต์ ๋ฒ ๋ชฉ๋ก์์ ํํดํ๊ณ ์ถ๋ค๋ ์์ฒญ์ ํ๋ค.
- ์ฅ ๊ฐ์ฒด๋ ํ์ฐธ ์ ๋ถํฐ int ๊ฐ์ ๋ฐ์์์ง๋ง ์ง๊ฒจ์์ ํด์ง ์์ฒญ์ ํ๋ค.
- ์ฃผ์ ๊ฐ ์์ฒญ์ ๋ฐ์๋ค์ฌ ์ฅ ๊ฐ์ฒด๋ฅผ ์ต์ ๋ฒ ์งํฉ์์ ์ ๊ฑฐํ๋ค.
- ์ฃผ์ ์ ์๋ก์ด int ๊ฐ์ด ๋ค์ด์จ๋ค.
- ๋ชจ๋ ์ต์ ๋ฒ๊ฐ ๊ฐ์ด ๋ฐ๋์๋ค๋ ์ฐ๋ฝ์ ๋ฐ๋๋ค. ์ฅ๋ ์ด์ ์ฐ๋ฝ์ ๋ฐ์ ์ ์์ผ๋ฏ๋ก ์๋ก์ int ๊ฐ์ด ๋ฌด์์ธ์ง ์ ์ ์๊ณ , ์๊ณ ์ถ๋ค๋ฉด ๋ค์ ์ต์ ๋ฒ ๋ฑ๋ก ์์ฒญ์ ํ๋ฉด ๋๋ค.
โ๏ธย ์ต์ ๋ฒ ํจํด์ ์ ์
์ต์ ๋ฒ ํจํด(Observer Pattern) ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฐ๋๋ฉด ๊ทธ ๊ฐ์ฒด์ ์์กดํ๋ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ฐ๋ฝ์ด ๊ฐ๊ณ ์๋์ผ๋ก ๋ด์ฉ์ด ๊ฐฑ์ ๋๋ ๋ฐฉ์์ผ๋ก ์ผ๋๋ค(one-to-many) ์์กด์ฑ์ ์ ์ํ๋ค. ์ต์ ๋ฒ ํจํด์ ๋ณดํต ์ฃผ์ ์ธํฐํ์ด์ค์ ์ต์ ๋ฒ ์ธํฐํ์ด์ค๊ฐ ๋ค์ด์๋ ํด๋์ค ๋์์ธ์ผ๋ก ๊ตฌํํ๋ค.
โ๏ธย ๋์จํ ๊ฒฐํฉ์ ์๋ ฅ
๋์จํ ๊ฒฐํฉ(Loose Coupling)์ ๊ฐ์ฒด๋ค์ด ์ํธ์์ฉ ํ ์๋ ์์ง๋ง, ์๋ก๋ฅผ ์ ๋ชจ๋ฅด๋ ๊ด๊ณ๋ฅผ ์๋ฏธํ๋ค. ๋์จํ ๊ฒฐํฉ์ ํ์ฉํ๋ฉด ์ ์ฐ์ฑ์ด ์์ฃผ ์ข์์ง๋๋ฐ, ์ต์ ๋ฒ ํจํด์ ๋์จํ ๊ฒฐํฉ์ ๋ณด์ฌ์ฃผ๋ ํ๋ฅญํ ์๋ค.
- ์ฃผ์ ๋ ์ต์ ๋ฒ๊ฐ ํน์ ์ธํฐํ์ด์ค(Observer ์ธํฐํ์ด์ค)๋ฅผ ๊ตฌํํ๋ค๋ ์ฌ์ค๋ง ์๋ค.
- ์ต์ ๋ฒ์ ๊ตฌ์ ํด๋์ค๊ฐ ๋ฌด์์ธ์ง, ์ต์ ๋ฒ๊ฐ ๋ฌด์์ ํ๋์ง๋ ์ ํ์ ์๋ค.
- ์ต์ ๋ฒ๋ ์ธ์ ๋ ์ง ์๋ก ์ถ๊ฐํ ์ ์๋ค.
- ์ฃผ์ ๋ Observer ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด์ ๋ชฉ๋ก์๋ง ์์กดํ๋ฏ๋ก ์ธ์ ๋ ์ง ์๋ก์ด ์ต์ ๋ฒ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
- ์คํ ์ค ํ๋์ ์ต์ ๋ฒ๋ฅผ ๋ค๋ฅธ ์ต์ ๋ฒ๋ก ๋ฐ๊ฟ๋ ์ฃผ์ ๋ ๊ณ์ํด์ ๋ค๋ฅธ ์ต์ ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ค.
- ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฌด ๋๋ ์ต์ ๋ฒ๋ฅผ ์ ๊ฑฐํด๋ ๋๋ค.
- ์๋ก์ด ํ์์ ์ต์ ๋ฒ๋ฅผ ์ถ๊ฐํ ๋๋ ์ฃผ์ ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์ ํ ์๋ค.
- ์ต์ ๋ฒ๊ฐ ๋์ด์ผ ํ๋ ์๋ก์ด ๊ตฌ์ ํด๋์ค๊ฐ ์๊ธด ๊ฒฝ์ฐ, ์ฃผ์ ๋ฅผ ๋ฐ๊ฟ ํ์ ์์ด ์๋ก์ด ํด๋์ค์์ Observer ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์ต์ ๋ฒ๋ก ๋ฑ๋กํ๋ฉด ๋๋ฏ๋ก ์ฃผ์ ๋ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๋ค.
- ์ฃผ์ ์ ์ต์ ๋ฒ๋ ์๋ก ๋
๋ฆฝ์ ์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ์๋ก ๋จ๋จํ๊ฒ ๊ฒฐํฉ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฃผ์ ๋ ์ต์ ๋ฒ๊ฐ ๋ฌ๋ผ์ ธ๋ ์๋ก์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
๋์์ธ ์์น
์ํธ์์ฉํ๋ ๊ฐ์ฒด ์ฌ์ด์๋ ๊ฐ๋ฅํ๋ฉด ๋์จํ ๊ฒฐํฉ์ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋์จํ๊ฒ ๊ฒฐํฉํ๋ ๋์์ธ์ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ์ฌํญ์ด ์๊ฒจ๋ ๋ฌด๋ํ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ฐํ ๊ฐ์ฒด์งํฅ ์์คํ ์ ๊ตฌ์ถํ ์ ์๋ค. ๊ฐ์ฒด ์ฌ์ด์ ์ํธ์์กด์ฑ์ ์ต์ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
โ๏ธย ๊ธฐ์ ์คํ ์ด์ ์ค๊ณํ๊ธฐ
- Subject
- Observer
- ๋ชจ๋ ๊ธฐ์ ๊ตฌ์ฑ ์์์ Observer ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ
- ์ฃผ์ ์์ ์ต์ ๋ฒ์ ๊ฐฑ์ ๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณต
- DisplayElement
- ๋ชจ๋ ๋์คํ๋ ์ด ์์์ ๊ตฌํ ์ธํฐํ์ด์ค๋ฅผ ํ๋ ๋ ๋ง๋ฆ
- WeatherData
- Subject ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ
- CurrentConditionsDisplay
- WeatherData ๊ฐ์ฒด๋ก๋ถํฐ ์ป์ ํ์ฌ ์ธก์ ๊ฐ์ ๋ณด์ฌ์ค
- StatisticsDisplay
- ์ธก์ ์น์ ์ต์๊ฐ, ํ๊ท , ์ต๋๊ฐ์ ์ถ์ ํ๊ณ ํ๋ฉด์ ํ์ํจ
- ForecastDisplay
- ์ธก์ ์น๋ฅผ ๋ฐํ์ผ๋ก ๊ธฐ์ ์๋ณด๋ฅผ ํ๋ฉด์ ํ์ํจ
- ThirdPartyDisplay
- ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๋ Observer์ DisplayElement ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ์๋ก์ด ๋์คํ๋ ์ด ์์๋ฅผ ๋ง๋ค ์ ์์
โ๏ธย ๊ธฐ์ ์คํ ์ด์ ๊ตฌํํ๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pubilc interface Subject{
// Observer๋ฅผ ์ธ์๋ก ๋ฐ์ ๊ฐ๊ฐ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋กํ๊ฑฐ๋ ์ ๊ฑฐ
public void registerObserver(Observer o);
public void removeObserver(Observer o);
// ์ฃผ์ ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ๋ชจ๋ ์ต์ ๋ฒ์๊ฒ ๋ณ๊ฒฝ ๋ด์ฉ์ ์๋ฆผ
public void notifyObservers();
}
// ๋ชจ๋ ์ต์ ๋ฒ ํด๋์ค์์ ๊ตฌํํด์ผ ํจ
// ๋ฐ๋ผ์ ๋ชจ๋ ์ต์ ๋ฒ๋ update() ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํจ
public interface Observer{
public void update(float temp, float humidity, float pressure);
}
// ๋์คํ๋ ์ด ํญ๋ชฉ์ ํ๋ฉด์ ํ์ํด์ผ ํ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํจ
public interface DisplayElement{
public void display();
}
โ๏ธย Subject ์ธํฐํ์ด์ค ๊ตฌํํ๊ธฐ
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
40
41
42
43
44
45
46
47
public class WeatherData implements Subject {
// WeahterData์์ Subject ์ธํฐํ์ด์ค ๊ตฌํ
private List<Observer> observers; // Observer ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ArrayList ์ถ๊ฐ
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<Observer>(); // ์์ฑ์๊ฐ ๊ฐ์ฒด ์์ฑ
}
// ์ต์ ๋ฒ๊ฐ ๋ฑ๋ก์ ์์ฒญํ๋ฉด ๋ชฉ๋ก ๋งจ ๋ค์ ์ถ๊ฐ
public void registerObserver(Observer o) {
observers.add(o);
}
// ์ต์ ๋ฒ๊ฐ ํํด๋ฅผ ์์ฒญํ๋ฉด ๋ชฉ๋ก์์ ๋บ
public void removeObserver(Observer o) {
observers.remove(o);
}
// ๋ชจ๋ ์ต์ ๋ฒ์๊ฒ ์ํ ๋ณํ๋ฅผ ์๋ฆผ
// ๋ชจ๋ Observer ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ update() ๋ฉ์๋๊ฐ ์๋ ๊ฐ์ฒด๋ค์ด๋ฏ๋ก ์์ฝ๊ฒ ์ํ ๋ณํ๋ฅผ ์๋ ค์ค ์ ์์
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
// ์ฌ๊ธฐ๊น์ง Subject ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ ๋ถ๋ถ
// ๊ธฐ์ ์คํ
์ด์
์ผ๋ก๋ถํฐ ๊ฐฑ์ ๋ ์ธก์ ๊ฐ์ ๋ฐ์ผ๋ฉด ์ต์ ๋ฒ๋ค์๊ฒ ์๋ฆผ
public void measurementsChanged() {
notifyObservers();
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
// ์ค์ ์ฅ๋น์์ ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ๋ฉ์๋๋ฅผ ํ์ฉํด ๋์คํ๋ ์ด ํญ๋ชฉ์ ํ
์คํธ
measurementsChanged();
}
// ๊ธฐํ WeatherData ๋ฉ์๋
}
โ๏ธย ๋์คํ๋ ์ด ์์ ๊ตฌํํ๊ธฐ
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
// API ๊ตฌ์กฐ์ ๋ชจ๋ ๋์คํ๋ ์ด ํญ๋ชฉ์์ DisplayElement ๊ตฌํํ๊ธฐ๋ก ํ์ผ๋ฏ๋ก ๊ตฌํํจ
// WeatherData ๊ฐ์ฒด๋ก๋ถํฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ผ๋ ค๋ฉด Observer๋ฅผ ๊ตฌํํด์ผ ํจ
public class CurrentConditionsDisplay implements Observer, DisplayElement {
private float temperature;
private float humidity;
private WeatherData weatherData;
// ์์ฑ์์ weatherData๋ผ๋ ์ฃผ์ ๊ฐ ์ ๋ฌ๋๋ฉฐ, ๊ทธ ๊ฐ์ฒด๋ฅผ ์จ์ ๋์คํ๋ ์ด๋ฅผ ์ต์ ๋ฒ๋ก ๋ฑ๋ก
public CurrentConditionsDisplay(WeatherData weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
// update()๊ฐ ํธ์ถ๋๋ฉด ์จ๋์ ์ต๋๋ฅผ ์ ์ฅํ๊ณ display()๋ฅผ ํธ์ถ
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
// ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐ์ ์จ๋์ ์ต๋๋ฅผ ์ถ๋ ฅ
public void display() {
System.out.println("Current conditions: " + temperature
+ "F degrees and " + humidity + "% humidity");
}
}
โ๏ธย ํธ์์ ํ ๋ฐฉ์
์ต์ ๋ฒ ํจํด์์ ๊ตฌ๋ ์(Observer)๊ฐ ๋ณํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ์์ ํฌ๊ฒ ํธ์(Push) ๋ฐฉ์๊ณผ ํ(Pull) ๋ฐฉ์์ผ๋ก ๋๋๋ค.
โ 1. ํธ์(Push) ๋ฐฉ์: โ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ณด๋ด์คโ
์ฃผ์ (subject)๊ฐ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ต์ ๋ฒ(Observer)์๊ฒ ์๋์ผ๋ก ์ ๋ฌํ๋ ๋ฐฉ์.
- ์ต์ ๋ฒ๊ฐ ์ํ๋ ์ ๋ณด๋ง ์ ํํ ์ ์์: ์ฃผ์ ๊ฐ ์ฃผ๋ ๋๋ก ๋ฐ์์ผ ํจ
๐ข ๋ด์ค ์๋ฆผ(Push Notification)
1
- ๋ด์ค ์ฑ์์ "์๋ณด ์๋ฆผ"์ ๋ณด๋ด๋ฉด, ๋ด๊ฐ ์ํ๋ ์ํ์ง ์๋ ๋ฐ๋ก ๋ฐ์์ผ ํจ. - `useEffect()`์์ **์์กด์ฑ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋์ผ๋ก ์คํ**๋๋ ๊ฒ๊ณผ ๋น์ทํจ.
1
2
3
useEffect(() => {
console.log("์ํ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค:", count);
}, [count]); // count ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์๋ ์คํ (Push ๋ฐฉ์)
๐ ์ฅ์
โ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ฌ๋๋ฏ๋ก ๋ฐ์์ฑ์ด ์ข์.
๐ ๋จ์
โ ๋ถํ์ํ ๋ฐ์ดํฐ๊น์ง ๋ฐ์ ์ ์์ด ๋นํจ์จ์ ์ผ ์ ์์.
โ 2. ํ(Pull) ๋ฐฉ์: โํ์ํ ๋ ๊ฐ์ ธ๊ฐโ !MEMO : ๋์จํ ๊ฒฐํฉ์ ์๋
๐ ์ต์ ๋ฒ(Observer)๊ฐ ํ์ํ ๋๋ง ์ฃผ์ (subject)์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๋ฐฉ์.
- ๊ตฌ๋ ์๊ฐ ์ํ ๋๋ง ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์.
๐ ๋ผ๋ฉด ๋์ด๊ธฐ (Pull ๋ฐฉ์)
1
2
- ๋ฐฐ๊ณ ํ ๋ ๋ด๊ฐ ๋๋น๋ฅผ ์ด์ด๋ณด๊ณ "๋ค ๋๋?" ํ์ธํ๊ณ ๋จน์.
- ๋ผ๋ฉด์ด "๋ค ์ต์์ด์!"๋ผ๊ณ ๋งํด์ฃผ์ง๋ ์์. - `useStore.getState()`์ฒ๋ผ **ํ์ํ ๋ ์ง์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์**
1
2
const count = useStore.getState().count; // ํ์ฌ count ๊ฐ์ ์ง์ ๊ฐ์ ธ์ด (Pull ๋ฐฉ์)
console.log("ํ์ฌ ์นด์ดํธ ๊ฐ:", count);
๐ ์ฅ์
โ ๋ถํ์ํ ์ ๋ฐ์ดํธ๊ฐ ์ ์ด ์ฑ๋ฅ์ด ์ข์.
๐ ๋จ์
โ ์ค์๊ฐ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๋๋ ์ง์ ์์ฒญํด์ผ ํ๋ฏ๋ก ๋ถํธํ ์ ์์.
๐ฅ ์ ๋ฆฌ! ํธ์ vs ํ (ํ ์ค ์์ฝ)
| ๋ฐฉ์ | ๋์ ๋ฐฉ์ | ์ฅ์ | ๋จ์ |
|---|---|---|---|
| Push (ํธ์) | ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฐ๋ก ์ ๋ฌ | ์ค์๊ฐ ๋ฐ์์ฑ | ๋ถํ์ํ ๋ฐ์ดํฐ๊น์ง ๋ฐ์ ์ ์์ |
| Pull (ํ) | ํ์ํ ๋๋ง ์ง์ ์์ฒญ !MEMO : ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์๋ค๋ ์ฌ์ค๋ง ์ ๋ฌ > ํ์ํ๋ฉด ๊ฐ์ ธ๋ค๊ฐ ์จ | ๋ถํ์ํ ์ ๋ฐ์ดํธ ๋ฐฉ์ง | ์ค์๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋ถํธํ ์ ์์ |
โ๏ธย ํ ๋ฐฉ์์ผ๋ก ์ฝ๋ ๋ฐ๊พธ๊ธฐ
๊ฐ์ด ๋ณํ๋ค๋ ์๋ฆผ์ ์ต์ ๋ฒ๊ฐ ๋ฐ์์ ๋ ์ฃผ์ ์ ์๋ ๊ฒํฐ ๋ฉ์๋๋ฅผ ํธ์ถํด์ ํ์ํ ๊ฐ์ ๋น๊ฒจ์ค๋๋ก ๋ง๋ค ์ ์๋ค.
โ 1. ์ฃผ์ ์์ ์๋ฆผ ๋ณด๋ด๊ธฐ
- ์ต์ ๋ฒ์ update ๋ฉ์๋๋ฅผ ์ธ์ ์์ด ํธ์ถํ๋๋ก WeatherData์ notifyObservers() ๋ฉ์๋๋ฅผ ์์ ํ๋ค.
1
2
3
4
5
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
โ 2. ์ต์ ๋ฒ์์ ์๋ฆผ ๋ฐ๊ธฐ
- Observer ์ธํฐํ์ด์ค์์ update() ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๊ฐ ์๋๋ก ์๋ช ์ ๋ฐ๊ฟ์ค๋ค.
1
2
3
public interface Observer {
public void update()
}
- ๋ง์ง๋ง์ผ๋ก update() ๋ฉ์๋์ ์๋ช ์ ๋ฐ๊พธ๊ณ WeatherData์ ๊ฒํฐ ๋ฉ์๋๋ก ์ฃผ์ ์ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ฐ Observer ๊ตฌ์ ํด๋์ค๋ฅผ ์์ ํ๋ค.
1
2
3
4
5
public void update() {
this.temperature = weatherData.getTemperature()
this.humidity = weatherData.getHumidity()
display()
}
โ๏ธย ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ต์ ๋ฒ ํจํด ์์๋ณด๊ธฐ
๋: ์ต์ ๋ฒ ํจํด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ค์ค ์ฑ ์๋ ์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ค๋๋ฐ ์์ ๋ชจ๋ฅด๊ฒ ๊ณ ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ผ ์น์ํ ๊ฑฐ ์ถ์ฒํด์ค ๊ฑฐ๊ธฐ์ ์ด๋ป๊ฒ ์ต์ ๋ฒ ํจํด ์ฐ๋์ง๋ ๊ฐ์ด ์๋ ค์ค
C์ ์: Zustand๋ ๊ฐ๊ฒฐํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, subscribe ๋ฉ์๋๋ฅผ ํตํด ์ํ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ํน์ ๋์์ ์ํํ ์ ์์
- ์ต์ ๋ฒ ํจํด์ ์ ์ฉํ ์์:
store.subscribe(callback)์ ์ฌ์ฉํ์ฌ ์ํ ๋ณ๊ฒฝ์ ๊ฐ์ง ๊ฐ๋ฅ
๐ Zustand์์ ์ต์ ๋ฒ ํจํด์ด ์ด๋ป๊ฒ ์ ์ฉ๋์์๊น?
โ
subscribe()์ ํ์ฉํ ์ํ ๊ฐ์ง
Zustand๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ด๋ฅผ ๊ตฌ๋ (subscribe)ํ๊ณ , ๊ตฌ๋ ํ ์ปดํฌ๋ํธ๋ง ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { create } from 'zustand';
// Zustand ์คํ ์ด ์์ฑ
const useStore = create((set) => ({
count: 0,
increase: () => set((state) => ({ count: state.count + 1 })),
}));
// ๊ตฌ๋
(subscribe) ๊ธฐ๋ฅ ํ์ฉ
const unsubscribe = useStore.subscribe((state) => {
console.log("๐ข ์ํ ๋ณ๊ฒฝ ๊ฐ์ง:", state.count);
});
// ์ํ ๋ณ๊ฒฝ
useStore.getState().increase(); // ์ฝ์: ๐ข ์ํ ๋ณ๊ฒฝ ๊ฐ์ง: 1
// ๊ตฌ๋
ํด์
unsubscribe();
๐ง ์ต์ ๋ฒ ํจํด์ ํต์ฌ
useStore.subscribe((state) => {...})โ ์ํ ๋ณํ ๊ฐ์ง ํ ํน์ ๋์ ์คํunsubscribe()โ ํ์ ์์ ๋ ๊ตฌ๋ ํด์
๐ Zustand์์ ์ต์ ๋ฒ ํจํด์ ์ฐ๋ ์ด์
- ๋ถํ์ํ ๋ ๋๋ง ๋ฐฉ์ง: ํน์ ์ํ๋ฅผ ๊ตฌ๋ ํ ์ปดํฌ๋ํธ๋ง ์ ๋ฐ์ดํธ๋จ.
- ๋ฆฌ์กํฐ๋ธํ ์ํ ๊ด๋ฆฌ: ์ํ ๋ณํ ๊ฐ์ง ํ ์๋์ผ๋ก ๋ฐ์.
- ์ ์ญ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐํธ: Redux๋ณด๋ค ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์.
- ๊ตฌ๋ ํด์ ๊ธฐ๋ฅ ์ง์: ๋ถํ์ํ ๊ตฌ๋ ์ ์ ๋ฆฌํ ์ ์์ด ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ.
Zustand๊ฐ Redux, Context API๋ณด๋ค ๊ฐ๋ณ๊ณ ํจ์จ์ ์ธ ์ด์ ๋ ๋ฐ๋ก ์ต์ ๋ฒ ํจํด์ ํ์ฉํ ๊ตฌ๋ ์์คํ ๋๋ถ์ด๋ค.


