Prototype ํจํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋งค๋ฒ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋์ , ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ณต์ (clone, fork)ํ์ฌ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฐฉ์์
๋๋ค.
์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๊ฐ์ฒด ์์ฑ ๋น์ฉ์ ์ค์ผ ์ ์์ผ๋ฉฐ, ๊ฐ์ฒด์ ์ด๊ธฐ ์ํ๋ฅผ ๋ณต์ฌํด ๋น ๋ฅด๊ฒ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
How do code?
How do Code
// Prototype ์ธํฐํ์ด์ค (๋๋ ์ถ์ ํด๋์ค)
public abstract class Prototype implements Cloneable {
// ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ๋ ๋ฉ์๋ (๊น์ ๋ณต์ฌ๋ฅผ ์ํด ํ์ํ ๊ฒฝ์ฐ, ๋ด๋ถ ํ๋๋ค๋ ๋ณต์ )
public Prototype clone() {
try {
// ๊ธฐ๋ณธ์ ์ผ๋ก Object์ clone()์ ์ฌ์ฉ
return (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
// ์์ธ ์ฒ๋ฆฌ (ํ์์ ๋ฐ๋ผ ์ ์ ํ ์ฒ๋ฆฌ)
e.printStackTrace();
return null;
}
}
// ๊ณตํต ๊ธฐ๋ฅ ๋ฐ ํ๋ ์ ์ธ
public abstract void showInfo();
}
// ConcretePrototype: ์ค์ ๋ณต์ ๊ฐ๋ฅํ ๊ฐ์ฒด
public class ConcretePrototype extends Prototype {
private String data;
public ConcretePrototype(String data) {
this.data = data;
}
// ํ๋์ ๋ํ getter์ setter (๊น์ ๋ณต์ฌ๊ฐ ํ์ํ ํ๋๋ผ๋ฉด ๋ณต์ ๋ก์ง ์ถ๊ฐ)
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
@Override
public void showInfo() {
System.out.println("ConcretePrototype์ data: " + data);
}
}
// ํด๋ผ์ด์ธํธ ์ฝ๋: ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ์ฌ ์๋ก์ด ์ธ์คํด์ค ์์ฑ
public class PrototypeDemo {
public static void main(String[] args) {
ConcretePrototype original = new ConcretePrototype("์๋ณธ ๋ฐ์ดํฐ");
ConcretePrototype clone = (ConcretePrototype) original.clone();
// ๋ณต์ ๋ ๊ฐ์ฒด์ ์ํ ํ์ธ
clone.showInfo();
// ๋ณต์ ๋ ๊ฐ์ฒด์ ์ํ ๋ณ๊ฒฝ (์๋ณธ๊ณผ ๋ณ๊ฐ์ ์ธ์คํด์ค์์ ํ์ธ)
clone.setData("๋ณต์ ๋ณธ ๋ฐ์ดํฐ");
System.out.println("์๋ณธ ๊ฐ์ฒด:");
original.showInfo();
System.out.println("๋ณต์ ๊ฐ์ฒด:");
clone.showInfo();
}
}
// Prototype ์ธํฐํ์ด์ค (์ฌ๊ธฐ์๋ ๋ช
์์ ์ผ๋ก ๊ตฌํํ์ง ์๊ณ , data class์ copy() ๋ฉ์๋๋ฅผ ์ฌ์ฉ)
data class ConcretePrototype(var data: String) {
// showInfo() ๋ฉ์๋๋ก ๊ฐ์ฒด์ ์ํ๋ฅผ ์ถ๋ ฅ
fun showInfo() {
println("ConcretePrototype์ data: $data")
}
}
// ํด๋ผ์ด์ธํธ ์ฝ๋: ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ์ฌ ์๋ก์ด ์ธ์คํด์ค ์์ฑ
fun main() {
val original = ConcretePrototype("์๋ณธ ๋ฐ์ดํฐ")
// copy() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ณต์ (๊ธฐ๋ณธ์ ์ผ๋ก ์์ ๋ณต์ฌ์ด๋ฏ๋ก, ๋ด๋ถ์ ๊ฐ๋ณ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ๊น์ ๋ณต์ฌ ๋ก์ง ํ์)
val clone = original.copy()
// ๋ณต์ ๋ ๊ฐ์ฒด์ ์ํ ํ์ธ
clone.showInfo()
// ๋ณต์ ๋ ๊ฐ์ฒด์ ์ํ ๋ณ๊ฒฝ (์๋ณธ๊ณผ ๋ณ๊ฐ์ ์ธ์คํด์ค์์ ํ์ธ)
clone.data = "๋ณต์ ๋ณธ ๋ฐ์ดํฐ"
println("์๋ณธ ๊ฐ์ฒด:")
original.showInfo()
println("๋ณต์ ๊ฐ์ฒด:")
clone.showInfo()
}
ํต์ฌ ์์ด๋์ด
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ง๋ค ์๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋์ , ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ณต์ ํ์ฌ ์์ฑ ๋น์ฉ์ ์ ๊ฐํฉ๋๋ค.
๊น์ ๋ณต์ฌ vs ์์ ๋ณต์ฌ
๋ณต์ ์ ๋ด๋ถ ์ฐธ์กฐ ๊ฐ์ฒด๊น์ง ๋ชจ๋ ๋ณต์ ํด์ผ ํ๋ค๋ฉด(๊น์ ๋ณต์ฌ) ๋ณ๋์ ๋ณต์ ๋ก์ง์ด ํ์ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Object.clone()
์ ์์ ๋ณต์ฌ๋ฅผ ์ํํ๋ฏ๋ก, ํ์์ ๋ฐ๋ผ ๊ฐ ํ๋๋ณ ๋ณต์ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
์ฅ์
๊ฐ์ฒด ์์ฑ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ ๋ณต์ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋๋ชจํ ์ ์์ต๋๋ค.