Skip to content

Latest commit

ย 

History

History
101 lines (67 loc) ยท 3.6 KB

Delegate Pattern.md

File metadata and controls

101 lines (67 loc) ยท 3.6 KB

Delegation ์ด๋ž€?

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

  • ์˜ˆ์‹œ

    ๋‹น์‹ ๊ณผ ๋‚ด๊ฐ€ ์ดˆ์ฝœ๋ฆฟ ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌํ•˜๋Š” ํŒ€์˜ ์ผ์›์ด๋ผ๊ณ  ์ƒ์ƒํ•ด๋ณด์ž.

    ๋‹น์‹ ์ด ์ฟ ํ‚ค ์ œ๋นต์„ ๋‹ด๋‹นํ•˜์—ฌ ์ด๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ '์ฟ ํ‚ค ๋ฐ˜์ฃฝ ๋งŒ๋“ค๊ธฐ' ์ผ์„ ๋‚˜์—๊ฒŒ ์œ„์ž„(delegate) ํ•œ๋‹ค.

    ๋‚ด๊ฐ€ ๋„์šฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๋‹น์‹ ์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์ด์šฉํ•ด์„œ ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋•Œ ๋ช‡๊ฐ€์ง€ ํ•ต์‹ฌ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

    • ๋‹น์‹ ์€ ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ๋งก์•˜๊ธฐ์— ๋‚˜์—๊ฒŒ '์ฟ ํ‚ค ๋„์šฐ ๋งŒ๋“ค๊ธฐ' ์—…๋ฌด๋ฅผ ์œ„์ž„ํ•œ๋‹ค.
    • ๋‚˜๋Š” ์œ„์ž„๋œ ์ž‘์—…(์ฟ ํ‚ค ๋ฐ˜์ฃฝ ๋„์šฐ ๋งŒ๋“ค๊ธฐ)์„ ๋งˆ์น˜๋ฉด ์ฟ ํ‚ค ๋ฐ˜์ฃฝ์„ ๋‹น์‹ ์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.

Delegation ์˜ˆ์ œ ์ฝ”๋“œ

  • Cookie ๊ตฌ์กฐ์ฒด
struct Cookie {
    var size: Int = 5
    var hasChocoChips: Bool = false
}
  • Bakery ํด๋ž˜์Šค
class Bakery {
    func makeCooke() {
        cookie.size = 6
        cookie.hasChocoChips = true
    }
}

์œ„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด Bakery๋ผ๋Š” ํด๋ž˜์Šค๋Š” ๋‚ด๋ถ€์—์„œ Cookie ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cookie๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ผ๋ถ€ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” makeCookie()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์šฐ๋ฆฌ๋Š” ์ฟ ํ‚ค๋ฅผ ์„ธ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํŒ๋งคํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

  • ์˜คํ”„๋ผ์ธ ๋ฒ ์ด์ปค๋ฆฌ ์ƒต์—์„œ ํŒ๋งค
  • ์˜จ๋ผ์ธ ๋ฒ ์ด์ปค๋ฆฌ ์›น ์‚ฌ์ดํŠธ์—์„œ ํŒ๋งค
  • ์œ ํ†ต ์—…์ฒด ๋„๋งค๋ฅผ ํ†ตํ•œ ํŒ๋งค

์ฟ ํ‚ค๋ฅผ ํŒ๋งคํ•˜๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์˜ ์ฑ…์ž„์ด ์•„๋‹ˆ์ง€๋งŒ, ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ์šฐ๋ฆฌ์˜ ์ฑ…์ž„์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ฟ ํ‚ค๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ Delegation๊ฐœ๋…์ด ์ด์šฉ๋œ๋‹ค.

์ฒซ ๋ฒˆ์งธ, ์šฐ๋ฆฌ๋Š” Protocol์„ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ ๋‚ด์—๋Š” ์ฟ ํ‚ค๋ฅผ ํŒ๋งค์ฒ˜์— ์ „๋‹ฌํ•˜๋Š” ์ฑ…์ž„์˜ ๋‚ด์šฉ๋“ค์„ ์บก์Аํ™”ํ•œ๋‹ค.

BakeryDelegate ํ”„๋กœํ† ์ฝœ ์•ˆ์— cookieWasBaked๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ณ , ์ด delegate ํ•จ์ˆ˜(=cookieWasBaked)๋Š” ์ฟ ํ‚ค๊ฐ€ ๊ตฌ์›Œ์งˆ ๋•Œ ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.

protocol BakeryDelegate {
    func cookieWasBaked(_ cookie: Cookie)
}

๋‘ ๋ฒˆ์งธ, ์œ„ delegate๋ฅผ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ํ†ตํ•ฉํ•œ๋‹ค.

class Bakery {
    var delegate: BakeryDelegate?

    func makeCooke() {
        var cookie = Cookie()
        cooke.size = 6
        cookie.hasChocoChips = true

        delegate?.cookieWasBaked(cookie)
    }
}

๊ธฐ์กด Bakery ํด๋ž˜์Šค์—์„œ ๋‘ ๊ฐ€์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

  1. BakeryDelegate ํƒ€์ž…์˜ delegate ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
  2. ํ•จ์ˆ˜ cookieWasBaked()๊ฐ€ makeCookie() ํ•จ์ˆ˜ ๋‚ด๋ถ€ delegate์—์„œ ํ˜ธ์ถœ๋œ๋‹ค.

Delegate Pattern ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

  • iOS ๊ฐœ๋ฐœ ํŒจํ„ด ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํŒจํ„ด์ด๋‹ค. Apple framework๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ํŒจํ„ด์ด๋‹ค.

  • iOS์—์„œ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ delegation์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ํด๋ž˜์Šค๊ฐ€ ๋‹จ์ผ ์ƒ์†๋งŒ์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์ฆ‰, ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ๋‚˜๋ฉด ๋”๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ธฐ๋Šฅ์„ ๋ง๋ถ™์ด๊ธฐ ์ œํ•œ์ ์ด๋‹ค. ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜„ ๊ฐœ์ˆ˜์— ์ œํ•œ์ด ์—†๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋‹จ์œ„๋ณ„ ๊ฐ์ฒด๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

  • ๊ฒฐ๋ก ์ ์œผ๋กœ, ๊ฐœ๋ฐœ์˜ ์œ ์—ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•œ๋‹ค !!


์ฐธ๊ณ  ์ž๋ฃŒ

Using Delegates to Customize Object Behavior

Delegation in Swift Explained