Prototype
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()์ ์์ ๋ณต์ฌ๋ฅผ ์ํํ๋ฏ๋ก, ํ์์ ๋ฐ๋ผ ๊ฐ ํ๋๋ณ ๋ณต์ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.์ฅ์ ๊ฐ์ฒด ์์ฑ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ ๋ณต์ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋๋ชจํ ์ ์์ต๋๋ค.
Last updated