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();
    }
}
  • ํ•ต์‹ฌ ์•„์ด๋””์–ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ , ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ƒ์„ฑ ๋น„์šฉ์„ ์ ˆ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊นŠ์€ ๋ณต์‚ฌ vs ์–•์€ ๋ณต์‚ฌ ๋ณต์ œ ์‹œ ๋‚ด๋ถ€ ์ฐธ์กฐ ๊ฐ์ฒด๊นŒ์ง€ ๋ชจ๋‘ ๋ณต์ œํ•ด์•ผ ํ•œ๋‹ค๋ฉด(๊นŠ์€ ๋ณต์‚ฌ) ๋ณ„๋„์˜ ๋ณต์ œ ๋กœ์ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Object.clone()์€ ์–•์€ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, ํ•„์š”์— ๋”ฐ๋ผ ๊ฐ ํ•„๋“œ๋ณ„ ๋ณต์ œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์žฅ์  ๊ฐ์ฒด ์ƒ์„ฑ ๋น„์šฉ์ด ํฐ ๊ฒฝ์šฐ ๋ณต์ œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ๋„๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated