ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

 

 

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด

 

 

- ์†Œ๊ฐœ

์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๊ณ 

ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ตฌ์ฒด์ ์ธ ๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

 

 

- ์žฅ์ 

์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

 

- ์˜ˆ์‹œ

 

class Coffee {
    func boilWater() { print("๋ฌผ ๋“์ด๋Š” ์ค‘") } // ๊ณตํ†ต
    func brew() { print("ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ์ปคํ”ผ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘") }
    func pourInCup() { print("์ปต์— ๋”ฐ๋ฅด๋Š” ์ค‘") } // ๊ณตํ†ต
    func addCondiments() { print("์„คํƒ•๊ณผ ์šฐ์œ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘") }
}

class Tea {
    func boilWater() { print("๋ฌผ ๋“์ด๋Š” ์ค‘") } // ๊ณตํ†ต
    func brew() { print("์ฐจ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘") }
    func pourInCup() { print("์ปต์— ๋”ฐ๋ฅด๋Š” ์ค‘") } // ๊ณตํ†ต
    func addCondiments() { print("๋ ˆ๋ชฌ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘") }
}

 

 

์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ

func boilWater() { print("๋ฌผ ๋“์ด๋Š” ์ค‘") } // ๊ณตํ†ต
func pourInCup() { print("์ปต์— ๋”ฐ๋ฅด๋Š” ์ค‘") } // ๊ณตํ†ต

 

 

 

 

 

// ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•œ ์ƒ์œ„ ์ˆ˜์ค€ ํด๋ž˜์Šค
class Beverage {
    final func prepareRecipe() {
        boilWater()
        brew()
        pourInCup()
        addCondiments()
    }
    
    func boilWater() { print("๋ฌผ ๋“์ด๋Š” ์ค‘") } // ๊ณตํ†ต
    func brew() { fatalError("์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ") }
    func pourInCup() { print("์ปต์— ๋”ฐ๋ฅด๋Š” ์ค‘") } // ๊ณตํ†ต
    func addCondiments() { fatalError("์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ") }
}

// ํ•˜์œ„ ์ˆ˜์ค€ ํด๋ž˜์Šค
class Coffee: Beverage {
    override func brew() { print("ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ์ปคํ”ผ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘") }
    override func addCondiments() { print("์„คํƒ•๊ณผ ์šฐ์œ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘") }
}

class Tea: Beverage {
    override func brew() { print("์ฐจ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘") }
    override func addCondiments() { print("๋ ˆ๋ชฌ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘") }
}


let coffee = Coffee()
coffee.prepareRecipe() 

let tea = Tea()
tea.prepareRecipe()

 

Beverage ์ƒ์œ„ class์—์„œ prepareRecipe(์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌ์กฐ)๋ฅผ ์ •์˜ํ•˜๊ณ 

ํ•˜์œ„ class์ธ Coffee์—์„œ ๊ตฌ์ฒด์ ์ธ ๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

 

 

final func prepareRecipe() {
        boilWater()
        brew()
        pourInCup()
        addCondiments()
    }

 

prepareRecipe func ์ด ๋ถ€๋ถ„์ด ์ƒ์œ„ ์ˆ˜์ค€์—์„œ์˜ 'ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ' ์ž…๋‹ˆ๋‹ค

 

 

 

 

ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ๋Š” ํŠน์ • ์Œ๋ฃŒ์— ๋งž๊ฒŒ brew()์™€ addCondiments() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

 

// ํ•˜์œ„ ์ˆ˜์ค€์˜ ํด๋ž˜์Šค
class Coffee: Beverage {
    override func brew() { print("ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ์ปคํ”ผ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘") }
    override func addCondiments() { print("์„คํƒ•๊ณผ ์šฐ์œ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘") }
}

class Tea: Beverage {
    override func brew() { print("์ฐจ๋ฅผ ์šฐ๋ ค๋‚ด๋Š” ์ค‘") }
    override func addCondiments() { print("๋ ˆ๋ชฌ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ค‘") }
}

 

 

์ด๋ ‡๊ฒŒ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

 

์ƒˆ๋กœ์šด ์Œ๋ฃŒ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์Œ๋ฃŒ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€๊ฒฝํ•  ๋•Œ,

prepareRecipe() ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ์† 'Hook'

 

- ์ •์˜

์ถ”์ƒ ํด๋ž˜์Šค์— ์„ ์–ธ๋˜์ง€๋งŒ ๊ตฌํ˜„๋˜์–ด์žˆ์ง€ ์•Š๊ณ  ์•„๋ฌด ์ฝ”๋“œ๋„ ๋“ค์–ด์žˆ์ง€ ์•Š์€ ๋ฉ”์†Œ๋“œ

 

-> ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ํ•„์š”ํ• ๋•Œ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ

 

 

 

 

 

 

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ์‹ค์šฉ

- ๊ตฌ์กฐ์ฒด ๋น„๊ตํ•˜๊ธฐ (์ •๋ ฌํ•˜๊ธฐ)

 

 

 

๋ฐฐ์—ด์„ ์ •๋ ฌํ• ๋•Œ Array Struct ๋‚ด๋ถ€์—์„œ ์ •์˜๋œ sort ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

let array2 = [4,3,5,2,1,6]
print(array2.sorted()) // [1, 2, 3, 4, 5, 6]

 

 

 

 

๋งŒ์•ฝ ์•„๋ž˜ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •๋ ฌํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ

 

struct Person {
    let name: String
    let age: Int
}

let jh = Person(name: "์žฌํ˜•", age: 30)
let tw = Person(name: "ํƒœ์™„ํ˜•", age: 31) 

let array = [tw, jh]
print(array.sorted())

 

 

์ด๋ ‡๊ฒŒ sorted ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ์‹œ,

 

 

 

 

 

sorted() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

Person ๊ตฌ์กฐ์ฒด๊ฐ€ Comparable๋ฅผ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

 

 

struct Person {
    let name: String
    let age: Int
}

extension Person: Comparable {
    static func < (lhs: Person, rhs: Person) -> Bool {
        return lhs.age < rhs.age
    }
    
    static func > (lhs: Person, rhs: Person) -> Bool {
        return lhs.age > rhs.age
    }
}


let jh = Person(name: "์žฌํ˜•", age: 30)
let tw = Person(name: "ํƒœ์™„ํ˜•", age: 31)
let dk = Person(name: "๊ฐ“๋„๊ฒฝ", age: 30)
let sh = Person(name: "์†กํ•˜๋ˆ„๋‹˜", age: 31)

let array = [dk, tw, sh, jh]

print(array.sorted())

 

 

 

sorted() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š”

Person ๊ตฌ์กฐ์ฒด์—์„œ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฑ„ํƒ ํ•ฉ๋‹ˆ๋‹ค.

 

*Comparable ์ธํ„ฐํŽ˜์ด์Šค - ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ์ •์˜๋œ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ

 

 

 

 

 

 

 

๊ทธ๋ฆฌ๊ณ  ํ•˜์œ„ ์ˆ˜์ค€์ธ Person์—์„œ < , > ์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

extension Person: Comparable {
    static func < (lhs: Person, rhs: Person) -> Bool {
        return lhs.age < rhs.age
    }
    
    static func > (lhs: Person, rhs: Person) -> Bool {
        return lhs.age > rhs.age
    }
}

 

 

<, > ๋ฉ”์†Œ๋“œ๋ฅผ ํ•„์š”์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

๊ฒฐ๊ณผ

 

 

๊ตฌ์กฐ์ฒด๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด

ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

+ ์ „๋žต ํŒจํ„ด, ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด์˜ ์ฐจ์ด์ 

https://stackoverflow.com/questions/669271/what-is-the-difference-between-the-template-method-and-the-strategy-patterns

 

 

 

 

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

๋Œ“๊ธ€