
ํ์ ํจํด์ ๊ฐ์ฒด๋ค ๊ฐ์ ์ํธ์์ฉ๊ณผ ์ฑ ์ ๋ถ๋ฐฐ๋ฅผ ๋ค๋ฃจ๋ ํจํด
์ ๋ต ํจํด : ์ด๋ค ๋์์ ํ๋ ๋ก์ง์ ์ ์ํ๊ณ , ์ด๊ฒ๋ค์ ํ๋๋ก ๋ฌถ์ด(์บก์ํ) ๊ด๋ฆฌํ๋ ํจํด
์ ์ฐ์ฑ: ๋ฐํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ด ๋ค์ํ ์ํฉ์ ์ ์ ๊ฐ๋ฅํจ.
ํ์ฅ์ฑ: ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ ์ง๋ณด์๊ฐ ์ฉ์ดํจ.
์ฝ๋์ ๋จ์ํ: ์กฐ๊ฑด๋ฌธ์ ์ค์ด๊ณ ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ ๋ฆฝ์ ์ธ ํด๋์ค๋ก ๊ด๋ฆฌํ ์ ์์.
๋ณต์ก์ฑ ์ฆ๊ฐ: ์๊ณ ๋ฆฌ์ฆ์ด ๋ง์์ง์๋ก ๊ด๋ฆฌํด์ผ ํ ํด๋์ค ์๊ฐ ์ฆ๊ฐํจ.
์ค๋ณต ๊ฐ๋ฅ์ฑ: ์ฌ๋ฌ ์ ๋ต ํด๋์ค์์ ๋น์ทํ ์ฝ๋๊ฐ ์ค๋ณต๋ ์ ์์.
์ต์ ๋ฒ ํจํด : ๊ฐ์ฒด์ ์ํ ๋ณํ๊ฐ ์์ ๋, ์์กดํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์๊ฒ ์๋์ผ๋ก ํต์งํ์ฌ ์ํ๋ฅผ ๊ฐฑ์ ํ ์ ์๊ฒ ํ๋ ํจํด
๋์จํ ๊ฒฐํฉ: ์ฃผ์ (Subject)์ ์ต์ ๋ฒ(Observer) ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ, ์ํ ๋ณํ๊ฐ ์์ ๋ ์ฝ๊ฒ ๊ฐ์ฒด๋ค์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์.
ํ์ฅ์ฑ: ์ต์ ๋ฒ๋ฅผ ์์ ๋กญ๊ฒ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ผ๋ฉฐ, ์ฃผ์ ์ ์๊ด์์ด ๋ ๋ฆฝ์ ์ผ๋ก ๋์ ๊ฐ๋ฅํจ.
์๋ ์ ๋ฐ์ดํธ: ์ํ ๋ณํ๊ฐ ์์ ๋ ์๋์ผ๋ก ๋ณ๊ฒฝํ ํ์ ์์ด, ์๋์ผ๋ก ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์ํ๋ฅผ ๊ฐฑ์ ํจ.
๋ณต์ก์ฑ ์ฆ๊ฐ: ์ต์ ๋ฒ๊ฐ ๋ง์์ง์๋ก ํต์ ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง ์ ์์.
์ฑ๋ฅ ๋ฌธ์ : ๋ง์ ์ต์ ๋ฒ๊ฐ ๋ฑ๋ก๋ ๊ฒฝ์ฐ, ์ํ ๋ณํ ์ ๋ชจ๋ ์ต์ ๋ฒ์๊ฒ ์๋ฆผ์ ๋ณด๋ด๋ ๋ฐ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ ์ ์์.
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด : ์์ ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ผ๋๋ฅผ ์ ์ํ๊ณ , ํ์ ํด๋์ค์์ ๊ทธ ๋ผ๋์ ๋ง์ถฐ ํ์ํ ๋ถ๋ถ๋ง ์ฌ์ ์ํ์ฌ ์ฌ์ฉํจ.
์ฆ, ์๊ณ ๋ฆฌ์ฆ์ ๊ณตํต๋ ๋ถ๋ถ์ ์์ ํด๋์ค์์ ์ฒ๋ฆฌํ๊ณ , ๊ฐ๋ณ์ ์ธ ๋ถ๋ถ๋ง ํ์ ํด๋์ค์์ ๊ตฌํํจ.
์ฝ๋ ์ฌ์ฌ์ฉ์ฑ: ์์ ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณตํต๋ ๋ถ๋ถ์ ์ ์ํ๋ฏ๋ก, ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์.
์ ์ฐ์ฑ: ํ์ ํด๋์ค์์ ํน์ ๋จ๊ณ๋ง ์ฌ์ ์ํ ์ ์์ด, ์์ ํด๋์ค์ ๊ตฌ์กฐ๋ ์ ์งํ๋ฉด์๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ตฌํ์ ์ ์ฉํ ์ ์์.
์๊ณ ๋ฆฌ์ฆ ๊ตฌ์กฐ ํต์ : ์์ ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฆ์ ์ ์ดํ ์ ์์ด, ํ์ ํด๋์ค๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒด ํ๋ฆ์ ๋ฐ๊พธ์ง ๋ชปํ๋๋ก ๋ณดํธํ ์ ์์.
์์์ ์์กด: ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก, ์์ ๊ณ์ธต์ด ๊น์ด์ง๋ฉด ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง ์ ์์.
๋ณ๊ฒฝ์ ์ด๋ ค์: ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒด ๊ตฌ์กฐ๊ฐ ์์ ํด๋์ค์ ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๊ฒฝ์ฐ์๋ ์์ ํด๋์ค๊น์ง ์์ ํด์ผ ํจ.
abstract : ๋ถ๋ชจ์ ๊ธฐ๋ฅ์ ์์์์ ํ์ฅ์์ผ๋๊ฐ๊ณ ์ถ์ ๋
interface : ํด๋น ํด๋์ค๊ฐ ๊ฐ์ง ํจ์์ ๊ธฐ๋ฅ์ ํ์ฉํ๊ณ ์ถ์ ๋
abstract๋ ๋ค์ค ์์ ๋ถ๊ฐ๋ฅ
abstract class Bread {
protected void ๋ฐ์ฃฝ() { System.out.println("๋ฐ์ฃฝ!"); }
abstract void ์ฌ๋ฃ์ถ๊ฐ();
protected void ๊ตฝ๊ธฐ() { System.out.println("๊ตฝ๊ธฐ!"); }
final void makeBread() { // ์์๋ฐ์ ํด๋์ค์์ ์์ ๋ถ๊ฐ
this.๋ฐ์ฃฝ();
this.์ฌ๋ฃ์ถ๊ฐ();
this.๊ตฝ๊ธฐ();
}
}
class GarlicBread extends Bread {
@Override
void ์ฌ๋ฃ์ถ๊ฐ() {
System.out.println("๋ง๋ ๋ฃ๊ธฐ!");
}
}
class CheeseBread extends Bread {
@Override
void ์ฌ๋ฃ์ถ๊ฐ() {
System.out.println("์น์ฆ ๋ฃ๊ธฐ!");
}
}
์ปฌ๋ ์ ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ ธ์ถํ์ง ์๊ณ , ๊ทธ ์์ ์์๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ํจํด
์ปฌ๋ ์ ์ ๋ค์ํ ์๋ฃ๊ตฌ์กฐ์ ์๊ด์์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ์์์ ์ ๊ทผํ ์ ์์.