๐Ÿ”ฎ ์”จ-์—์Šค/๐Ÿ— ๋””์ž์ธํŒจํ„ด

[์Šค์œ„ํ”„ํŠธ ๋””์ž์ธํŒจํ„ด] ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด(Factory Method Pattern)

๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด 2022. 2. 9. 18:24

ํŒฉํ† ๋ฆฌ ํŒจํ„ด (Factory Pattern)

๋จผ์ € ํŒฉํ† ๋ฆฌ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค. ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ทธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์—์„œ ์ง์ ‘ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํŒฉํ† ๋ฆฌ๋ผ๋Š” ๊ฐ์ฒด์—๊ฒŒ ๊ทธ ์ž‘์—…์„ ๋งก๊ฒจ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. 

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์™œ ํ•„์š”ํ• ๊นŒ์š”? ํŒฉํ† ๋ฆฌ ํŒจํ„ด์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ํ•œ ๋ฒˆ ์บก์Šํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์บก์Šํ™”ํ–ˆ์„ ๋•Œ๋Š” ๋‘ ๊ฐ€์ง€ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, ์ฒซ๋ฒˆ์งธ ํšจ๊ณผ๋Š” ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ผ์–ด์žˆ์„ ๋•Œ, ์ด ๋กœ์ง์„ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ๋‘๋ฒˆ์งธ ํšจ๊ณผ๋Š” ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ์–ธ์ œ๋“ ์ง€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ๋ฐ”๋€๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐœ์ฒด๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ํŒฉํ† ๋ฆฌ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋งŒ ์ˆ˜์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์ฃ . ๋งŒ์•ฝ ์˜์กด์„ฑ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ํŒฉํ† ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ด๋‘๊ณ  ํ•„์š”ํ•œ ํŒฉํ† ๋ฆฌ๋ฅผ ์„ ํƒํ•ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Head First Design Pattern์— ๋”ฐ๋ฅด๋ฉด ํŒฉํ† ๋ฆฌ ํŒจํ„ด ์ž์ฒด๋Š” ๋””์ž์ธ ํŒจํ„ด์œผ๋กœ ๋ณผ ์ˆ˜๋Š” ์—†๊ณ , ํŒฉํ† ๋ฆฌ๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด๊ณผ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ์ด ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ •์˜๋œ ๋””์ž์ธ ํŒจํ„ด์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž๊ตฌ์š”!

 

ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด (Factory Method Pattern)

The Factory Method Pattern defines an interface for creating an object. But, let subsclasses decide which class to instantiate. Factory method lets the class defer instantiation to subclass.

ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์˜ ํ•ต์‹ฌ์€ ์‹ค์ œ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ† ๋ฆฌ๋“ค์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ , ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์— ์˜ํ•ด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ํŒฉํ† ๋ฆฌ์˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์˜๋˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์˜๋ฏธํ•ด์š”. ์ฆ‰, ์‹ค์ œ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒฉํ† ๋ฆฌ๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์ฃ .

์œ„ ๊ทธ๋ฆผ์€ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์˜ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ตฌ์ฒด ํƒ€์ž…, ConcreteProduct์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, Product๋กœ ํƒ€์ž…๋“ค์„ ์ถ”์ƒํ™”ํ•˜๊ณ , ์ด ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์„ ํŒฉํ† ๋ฆฌ์ธ Creator์—๊ฒŒ ๋งก๊น๋‹ˆ๋‹ค.

Creator ์—ญ์‹œ๋„ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ๊ตฌ์ฒด ํƒ€์ž…์ด ์กด์žฌํ•ด ์‹ค์ œ๋กœ ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์€ Creator๋ฅผ ๋”ฐ๋ฅด๋Š” ํ•˜์œ„ ๊ณ„์ธต์˜ ํด๋ž˜์Šค์ธ ConcreteCreator์—์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. "ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ"๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์€ ์ด์œ ๋Š” ์—ฌ๋Ÿฌ ํŒฉํ† ๋ฆฌ๋“ค์„ ํ•˜๋‚˜๋กœ ์ถ”์ƒํ™”ํ•˜๊ณ  ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์š”ํ•œ ์ „๋žต์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™๋„ค์š”.

 

๋™๋ฌผ์นดํŽ˜ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ์ด์šฉํ•ด์„œ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?

import Foundation

protocol Animal {
    var name: String { get set }
    func sound()
}

class Dog: Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func sound() {
        print("\(name) Bark! ๐Ÿถ")
    }
}

class Cat: Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func sound() {
        print("\(name) Meow! ๐Ÿ˜ธ")
    }
}

๋จผ์ € ์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋  Concrete Product์ธ Dog ํด๋ž˜์Šค์™€ Cat ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด ๋‘˜์„ ์ถ”์ƒํ™”ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ธ Animal ํ”„๋กœํ† ์ฝœ์„ ์ž‘์„ฑํ–ˆ์–ด์š”. ์ด ํ”„๋กœํ† ์ฝœ์ด Product๊ฐ€ ๋˜๊ฒ ์ฃ . 

์šฐ๋ฆฌ๋Š” ์ด์ œ Dog ๋‚˜ Cat ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•ด์š”. ๋”ฐ๋ผ์„œ Concrete Creator๋Š” ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Dog๋‚˜ Cat์„ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒฉํ† ๋ฆฌ๊ฐ€ ๋˜๊ฒ ์ฃ .

protocol AnimalFactory {
    func make(with name: String) -> Animal
}

class RandomAnimalFactory: AnimalFactory {
    func make(with name: String) -> Animal {
        return Int.random(in: 0...1) == 0 ? Dog(name: name) : Cat(name: name)
    }
}

class EvenAnimalFactory: AnimalFactory {
    var previousState: Animal.Type?
    func make(with name: String) -> Animal {
        if previousState == Cat.self {
            self.previousState = Dog.self
            return Dog(name: name)
        } else {
            self.previousState = Cat.self
            return Cat(name: name)
        }
    }
}

๋‘ ์ข…๋ฅ˜์˜ ํŒฉํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‘ ํŒฉํ† ๋ฆฌ ๋ชจ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ์š”, ์ด๋ ‡๊ฒŒ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์˜ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค. RandomAnimalFactory๋Š” ๋žœ๋คํ•˜๊ฒŒ ๊ฐ•์•„์ง€๋‚˜ ๊ณ ์–‘์ด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , EvenAnimalFactory๋Š” ์ด์ „์— ์ƒ์„ฑํ•œ ํƒ€์ž…์„ ๊ธฐ์–ตํ•ด์„œ ๋˜‘๊ฐ™์€ ๋™๋ฌผ์ด ์—ฐ๋‹ฌ์•„ ๋‚˜์˜ค์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ ์ด ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด์ธ ๋™๋ฌผ์นดํŽ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.

class AnimalCafe {
    private var animals = [Animal]()
    private var factory: AnimalFactory
    
    init(factory: AnimalFactory) {
        self.factory = factory
    }
    
    func addAnimal(with name: String) {
        self.animals.append(self.factory.make(with: name))
    }
    
    func printAnimals() {
        self.animals.forEach { animal in
            animal.sound()
        }
    }
    
    func change(factory: AnimalFactory) {
        self.factory = factory
    }
    
    func clear() {
        self.animals = []
    }
}

๊ตฌํ˜„์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ–ˆ๋Š”๋ฐ์š”, ์นดํŽ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•  ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›๊ณ , ์ƒˆ๋กœ์šด ๋™๋ฌผ์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋™๋ฌผ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํŒฉํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค๊ณ  ๋ฐ˜ํ™˜๋ฐ›์•„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

let animalCafe = AnimalCafe(factory: EvenAnimalFactory())
animalCafe.addAnimal(with: "A")
animalCafe.addAnimal(with: "B")
animalCafe.addAnimal(with: "C")
animalCafe.addAnimal(with: "D")
animalCafe.addAnimal(with: "E")
animalCafe.addAnimal(with: "F")
animalCafe.printAnimals()

animalCafe.clear()
print("\n## Change Factory ##\n")
animalCafe.change(factory: RandomAnimalFactory())
animalCafe.addAnimal(with: "A")
animalCafe.addAnimal(with: "B")
animalCafe.addAnimal(with: "C")
animalCafe.addAnimal(with: "D")
animalCafe.addAnimal(with: "E")
animalCafe.addAnimal(with: "F")
animalCafe.printAnimals()

์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋™๋ฌผ์นดํŽ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ด…์‹œ๋‹ค!

๊ฒฐ๊ณผ๋Š” ์˜๋„ํ•œ๋Œ€๋กœ ์ž˜ ๋‚˜์™”๋„ค์š”! ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ์—†์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ์ƒˆ๋กœ์šด ํŒฉํ† ๋ฆฌ๋ฅผ ์ฃผ์ž…ํ•ด์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ์œ„ํ•œ ๋‹ค๋ฅธ ์ „๋žต์„ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋งŒ์•ฝ ๋™๋ฌผ ์นดํŽ˜์— ์ƒˆ๋กœ์šด ๋™๋ฌผ์ด ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ๋™๋ฌผ์นดํŽ˜๋Š” ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋™์ผํ•˜๊ฒŒ ๋™๋ฌผ ์นดํŽ˜ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋งˆ๋ฌด๋ฆฌ

ํŒฉํ† ๋ฆฌ ํŒจํ„ด, ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด, ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด ํ•ญ์ƒ ํ—ท๊ฐˆ๋ฆฌ์ฃ .. ์ด์ „์— "ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด vs ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด"์ด๋ผ๋Š” ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ ์ ์ด ์žˆ๋Š”๋ฐ, ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ ์ž˜๋ชป ์“ด ๊ฒƒ ๊ฐ™๋”๋ผ๊ตฌ์š”. ์ผ๋‹จ ๋น„๊ณต๊ฐœ๋กœ ๋Œ๋ ค๋‘์—ˆ์Šต๋‹ˆ๋‹คใ… 

์ง€๊ธˆ๊นŒ์ง€ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์€ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ํŒฉํ† ๋ฆฌ๋ผ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋”ฐ๋กœ ๋‘๋Š” ๊ธฐ๋ฒ•์ด๊ณ , ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์€ ์ด ํŒฉํ† ๋ฆฌ๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์„œ ๊ตฌํ˜„์ฒด๊ฐ€ ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ฒŒ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณผ๊ฒŒ์š”! 

์•„์ง ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•œ ๊ณต๋ถ€๊ฐ€ ๋งŽ์ด ๋ถ€์กฑํ•ด์„œ ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”. ํ˜น์‹œ ์ž˜๋ชป๋œ ๋‚ด์šฉ์ด๋‚˜ ์˜ˆ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ผญ ์•Œ๋ ค์ฃผ์„ธ์š”! ์ €๋„ ๋‹ค์‹œ ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ์ˆ˜์ •ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค! 

์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~!