๐ ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด?
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ๊ฐ์ฒด์งํฅ ๋์์ธ ํจํด ์ค ํ๋๋ค.
๊ณตํต๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ฝ๋๋ฅผ ๋ถ๋ชจ ํด๋์ค์์ ์ ์ํ๊ณ , ์ธ๋ถ ๊ตฌํ์ ์์ ํด๋์ค์์ ๋ฐ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ง๋๋ ๋ฐฉ์.
์ด๋ ๊ฒ ํ๋ฉด ๋์ผํ ๊ตฌ์กฐ์ ๊ป๋ฐ๊ธฐ๋ฅผ ๋ฐ๋ณตํด์ ์ฐ์ง ์์๋ ๋ผ์ ์ฝ๋๊ฐ ๊น๋ํด์ง๋ค.
![[๋์์ธ ํจํด] ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด [๋์์ธ ํจํด] ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด](https://blog.kakaocdn.net/dn/w45sy/btsMVxiC47M/VqvFMqgjjk6LZKOUCwxjEk/img.png)
๐ ์์ ์ฝ๋๋ก ์ดํดํด๋ณด์
์๋ฅผ ๋ค์ด, ๊ฒ์ ์บ๋ฆญํฐ๊ฐ ๊ณต๊ฒฉํ๋ ๊ณผ์ ์ ์๊ฐํด๋ณด์.
๋ชจ๋ ์บ๋ฆญํฐ๋ "์ค๋น -> ๊ณต๊ฒฉ -> ๋ง๋ฌด๋ฆฌ"๋ผ๋ ๊ณตํต ํ๋ฆ์ ๊ฐ์ง๋๋ฐ, ๊ตฌ์ฒด์ ์ธ ๊ณต๊ฒฉ ๋ฐฉ์์ ์บ๋ฆญํฐ๋ง๋ค ๋ค๋ฅด๋ค.
์ด๊ฑธ ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด์ผ๋ก ๊ตฌํํ๋ฉด:
// ๋ถ๋ชจ ํด๋์ค
abstract class Character {
// ํ
ํ๋ฆฟ ๋ฉ์๋: ๊ณตํต ํ๋ฆ ์ ์
public void attack() {
System.out.println("์บ๋ฆญํฐ๊ฐ ๊ณต๊ฒฉ์ ์ค๋นํ๋ค.");
System.out.println("์ฅ๋น๋ฅผ ์ ๊ฒํ๋ค.");
System.out.println("์ ์ ์กฐ์คํ๋ค."); // context ๋ถ๋ถ์ด ๊ฝค ๊ธธ๋ค๊ณ ๊ฐ์
call(); // ์์ ํด๋์ค์์ ๊ตฌํํ ๋ถ๋ถ
System.out.println("๊ณต๊ฒฉ ํ ํผ๋ก๋ฅผ ๋๋๋ค.");
System.out.println("์ฅ๋น๋ฅผ ์ ๋ฆฌํ๋ค.");
}
// ์์ ํด๋์ค๊ฐ ๊ตฌํํ ์ถ์ ๋ฉ์๋
abstract void call();
}
// ์์ ํด๋์ค 1
class Warrior extends Character {
@Override
void call() {
System.out.println("์ ์ฌ๊ฐ ์นผ์ ํ๋๋ฅธ๋ค.");
}
}
// ์์ ํด๋์ค 2
class Mage extends Character {
@Override
void call() {
System.out.println("๋ง๋ฒ์ฌ๊ฐ ๋ถ๋ฉ์ด๋ฅผ ์๋ค.");
}
}
public class Main {
public static void main(String[] args) {
Character warrior = new Warrior();
Character mage = new Mage();
warrior.attack();
System.out.println("---");
mage.attack();
}
}
์ฌ๊ธฐ์ attack()
๋ฉ์๋๊ฐ ํ
ํ๋ฆฟ.
๊ณตํต ๋ถ๋ถ์ธ "์ค๋น -> ๋ง๋ฌด๋ฆฌ"๋ ๋ถ๋ชจ ํด๋์ค์์ ์ฒ๋ฆฌํ๊ณ , call()
์ ์์ ํด๋์ค์์ ๊ฐ์ ๋ค๋ฅด๊ฒ ๊ตฌํํ๋ค.
์ฝ๋ ์ค๋ณต์ด ์ค์ด๋๋ ๊ฒ ๋๊ปด์ง๋ค.
โ ๏ธ ๋ฌธ์ ์ : ํด๋์ค๋ฅผ ๊ณ์ ์ฐ์ด๋ด์ผ ํ๋ค.
๊ทผ๋ฐ ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์์ ํด๋์ค๋ฅผ ๊ณ์ ๋ง๋ค์ด์ผ ํ๋ค๋ ๋ถํธํจ์ด ์๋ค.
์๋ฅผ ๋ค์ด, ์บ๋ฆญํฐ๋ง๋ค ์๋ก์ด ํด๋์ค๋ฅผ ์ ์ํด์ผ ํ๋๊น ์ฝ๋๊ฐ ๊ธธ์ด์ง ์ ์๋ค. ์ด๊ฑธ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ์ต๋ช
๋ด๋ถ ํด๋์ค.
โ๏ธ ์ต๋ช ๋ด๋ถ ํด๋์ค๋ก ํด๊ฒฐํ๊ธฐ
์ต๋ช
๋ด๋ถ ํด๋์ค๋ ํด๋์ค๋ฅผ ๋ณ๋๋ก ์ ์ํ์ง ์๊ณ , ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด์ ๊ตฌํ์ ๋ฃ๋ ๋ฐฉ์.
์ ์ฝ๋๋ฅผ ์ต๋ช
๋ด๋ถ ํด๋์ค๋ก ๋ฐ๊พธ๋ฉด:
public class Main {
public static void main(String[] args) {
// ์ต๋ช
๋ด๋ถ ํด๋์ค 1: ์ ์ฌ
Character warrior = new Character() {
@Override
void call() {
System.out.println("์ ์ฌ๊ฐ ์นผ์ ํ๋๋ฅธ๋ค.");
}
};
// ์ต๋ช
๋ด๋ถ ํด๋์ค 2: ๋ง๋ฒ์ฌ
Character mage = new Character() {
@Override
void call() {
System.out.println("๋ง๋ฒ์ฌ๊ฐ ๋ถ๋ฉ์ด๋ฅผ ์๋ค.");
}
};
warrior.attack();
System.out.println("---");
mage.attack();
// ์ต๋ช
๋ด๋ถ ํด๋์ค์ ํด๋์ค ์ด๋ฆ ํ์ธ
System.out.println("Warrior ํด๋์ค ์ด๋ฆ: " + warrior.getClass());
System.out.println("Mage ํด๋์ค ์ด๋ฆ: " + mage.getClass());
}
}
์คํํ๋ฉด Main$1
, Main$2
๊ฐ์ ์์ผ๋ก ์ถ๋ ฅ๋๋ค.
์ด๊ฑด ์ต๋ช
๋ด๋ถ ํด๋์ค๊ฐ ์๊ธฐ๋ฅผ ๊ฐ์ธ๊ณ ์๋ ํด๋์ค(Main) ์ด๋ฆ์ ๋ฒํธ๋ฅผ ๋ถ์ฌ์ ๋ง๋ค์ด์ง๋ค๋ ๋ป์ด๋ค.
๋ณ๋์ ํด๋์ค ํ์ผ์ ๋ง๋ค์ง ์์๋ ๋ผ์ ํธ๋ฆฌํ๋ค.
โ๏ธ์ต๋ช ๋ด๋ถ ํด๋์ค ๋ฌธ๋ฒ
์ต๋ช ๋ด๋ถ ํด๋์ค๋ ์ด๋ ๊ฒ ์ด๋ค:
new ๋ถ๋ชจํด๋์ค() {
@Override
void ๋ฉ์๋() {
// ๊ตฌํ ๋ด์ฉ
}
};
์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค๋ฅผ ๊ตฌํํ ๋ ์ฃผ๋ก ์ฐ์ด๊ณ , ํ ๋ฒ๋ง ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ์ ์ฉํ๋ค.
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ๋จ์
- ์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๊ฐํ๊ฒ ์์กดํ๋ค. ๋ถ๋ชจ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋ฉด ์์ ํด๋์ค๋ ์ํฅ์ ๋ฐ๋๋ค.
- ๋ณ๋์ ํด๋์ค๋ ์ต๋ช ๋ด๋ถ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. ์์์ ๋ณธ ๊ฒ์ฒ๋ผ ํด๋์ค๋ฅผ ๊ณ์ ์ ์ํ๊ฑฐ๋ ์ต๋ช ๋ด๋ถ ํด๋์ค๋ก ๋์ฒดํด์ผ ํ๋ค.
๋ง๋ฌด๋ฆฌ
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ๊ณตํต ๋ก์ง์ ์ฌ์ฌ์ฉํ๋ฉด์๋ ์ธ๋ถ ๊ตฌํ์ ์ ์ฐํ๊ฒ ๋ฐ๊ฟ ์ ์๊ฒ ํด์ค๋ค. ์ต๋ช ๋ด๋ถ ํด๋์ค๋ฅผ ํ์ฉํ๋ฉด ํด๋์ค ์ ์๋ฅผ ์ค์ผ ์๋ ์๊ณ . ์ํฉ์ ๋ง๊ฒ ์ ์จ๋ณด๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ง๋ค.
'Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก์ ํจํด ์ ๋ฆฌ (0) | 2025.04.01 |
---|---|
์ ๋ต ํจํด(Strategy Pattern) ์ ๋ฆฌ - ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด๊ณผ์ ์ฐจ์ด์ (0) | 2025.03.27 |
[๋์์ธ ํจํด] Builder ํจํด (0) | 2025.03.23 |
๋๊ธ