๐์ค๋์ ๊ฐ๋จํ๊ฒ Delegate Pattern์ ์ ์ฉํด๋ณด๋ ์์ ์ค์์ ํ๋ฉด ์ ํ ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์๋ณด๋ด๋ ์์ ์ ํด๋ณด๊ฒ ์ต๋๋ค.
๐ง๐ป๐ป ๋ค์ด๊ฐ๋ฉฐ
Delegate Pattern(๐? ๐??), ํญ์ ๊ณต๋ถํ๋ฉด์ ๊ทธ ์๊ฐ์๋ ์ดํดํ๊ณ ๋ถ๋ช ์๊ฒ ๋๋ฐ ๋๋์ฒด ์ด๋ ๋ถ๋ถ์ · ๋ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง ๊ฐ์ด ์ ์กํ๋๋ค... ์ ์ญ์๋ ๊ทธ๋ฐ๋ฐ์... ์ด์ฉ ์ ์์ด์... ๋ค์ํ ์ํฉ์ ์จ๋ณด๋ ค๊ณ ๋ ธ๋ ฅํด๋ณด๋ ์ ๋ฐ์ ์ด๋ฒ์ ์ต๋ํ ์ฌ๋ฌ ์ํฉ์ ์ฌ์ฉํด๋ณด๋ฉด์ ์ด๋ค ์ฅ๋จ์ ์ด ์๋์ง๋ ์์๋ณด๊ณ ์ฌ์ฉ๋ฒ์ ์ต์ํด์ง๋ ค๊ณ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ์ด ๋ ธ๋ ฅํด๋ณด์์.
๐บ ์คํ ํ๋ฉด
์ค๋ ๊ตฌํํด ๋ณผ ํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํฌ๊ฒ ์ํ ํ๋ฉด๊ณผ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ํ๋ฉด 2๊ฐ์ง๋ก ๊ตฌ์ฑ๋์ด์๊ตฌ์.
์ฐ์ ํ๋ฆ์ ์ค๋ช ํด๋๋ฆด๊ฒ์.
- ์ํ ํ๋ฉด์์ ์ฅ๋ฐ๊ตฌ๋ ๋ฒํผ์ ํด๋ฆญ
- ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ํ๋ฉด์ผ๋ก ์ด๋
- ๊ฐ์๋ฅผ ์ ํํ๊ณ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ๋ฒํผ ํด๋ฆญ
- ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ํ๋ฉด์ด ์ฌ๋ผ์ง๋ฉด์ ์ํ์ ๋ช ๊ฐ ์ถ๊ฐํ๋์ง ์๋ฆผ ํธ์ถ
์ด๋ป๊ฒ ํ๋ฉด ๋ ์ง ์ค์ค๋ก ๊ฐ๋จํ๊ฒ ๊ตฌ์ํด๋ณผ๊น์?
๐ง ์๊ฐํด ๋ณผ ์
๊ตฌ์์ ํ๋ค๋ณด๋ฉด ํ ๊ฐ์ง ๋๋ ์๊ฐ์ด ์์ ๊ฑฐ์์.
A(์ํ ํ๋ฉด) → B(์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ํ๋ฉด)
๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ ๋,
A(์ํ ํ๋ฉด)์์ B(์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ํ๋ฉด)๋ก ๋ฐ์ดํฐ(์ํ ์ด๋ฆ, ๊ฐ๊ฒฉ)๋ฅผ ๋๊ฒจ์ฃผ๋ ๊ฒ์ ํ๋กํผํฐ๋ก ๋๊ฒจ์ฃผ๋ฉด ๋๋๊น ์ด๋ ต์ง ์์๋ฐ, B(์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ํ๋ฉด)์์ A(์ํ ํ๋ฉด)๋ก ๋ฐ์ดํฐ(์ํ ๋ช ๊ฐ ๋ด์๋์ง ์ํ ๊ฐ์)๋ฅผ ๋๊ฒจ์ฃผ๋ ค๊ณ ํ๋ ๋จ์ํ ํ๋กํผํฐ์ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ผ๋ก๋ ๊ตฌํ์ด ๋์ง ์์ฃ .
์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ ๋ง ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ฌ์ค ์ ๋ง ๊ฐ๋จํ๊ฒ ํด๋ก์ (Closure)๋ก ์ฒ๋ฆฌํ ์๋ ์์ง๋ง ์ด๋ฒ์ ์ฐ๋ฆฌ๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด(Delegate Pattern)์ ์ด์ฉํด์ ํ ๋ฒ ์ฒ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
(์ด๋ก ์ ์ธ ๋ถ๋ถ์ ๋ค๋ฅธ ํฌ์คํ ์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค. ์๋๋ฉด ๊ณต์ ๋ฌธ์๋ ๋ค๋ฅธ ๋ธ๋ก๊ทธ์์ ๋ฏธ๋ฆฌ ๊ณต๋ถํ๊ณ ์ค์๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ๐)
โก๏ธ ๊ตฌํ ๋ฐฉ๋ฒ
์๋์์ ์ฌ์ฉํ๋ ๋น์ ๋ ์๋ฒฝํ ๋น์ ๋ ์๋๋๋ค.
๊ทธ๋ ๊ธฐ์ ํ๋กํ ์ฝ, ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์ ๋ํ ๊ฐ๋ ๊ณต๋ถ๋ฅผ ์ฐ์ ํ์คํ๊ฒ ํ๊ณ ์ค์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
์ฐ์ ์ธํ ๋ถํฐ ๋จผ์ ๋ณด์ฌ๋๋ฆด๊ฒ์.
- CartDelegate : ์ํ ๊ด๋ จ ์ฒ๋ฆฌ๋ฅผ ์ํ ํ๋กํ ์ฝ
- ViewController : ์ํ ๋ทฐ ์ปจํธ๋กค๋ฌ(ํ๋ฉด)
- CartViewController : ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ๋ทฐ ์ปจํธ๋กค๋ฌ(ํ๋ฉด)
์ ๊ตฌ์ฑ์ด ์ดํด๊ฐ ๋์์ผ๋ฉด ๋ค์์ผ๋ก ํฌ๊ฒ 3๊ฐ์ง๋ฅผ ์ ๊ฒฝ ์ธ ๊ฑฐ์์.
- ํ๋กํ ์ฝ(Protocol) - ์์ ์ ์ค๊ณ๋
- ์ ํธ๋ฅผ ์ฃผ๋ ์ชฝ(Sender)
- ์ ํธ๋ฅผ ๋ฐ๊ณ ์ฒ๋ฆฌํ ์ชฝ(Receiver)
1. ํ๋กํ ์ฝ - ์์ ์ ์ค๊ณ๋
CartDelegate.swift์ ํด๋นํ๋ ๋ถ๋ถ์ ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ํ๋กํ ์ฝ์์๋ ์ง์ ๊ตฌํ์ ํ์ง ์๋๋ค๋ ๊ฒ์ด์ฃ .
// CartDelegate.swift
import Foundation
protocol CartDelegate {
func alarmCartIsFilled(itemCount: Int)
}
์ฅ๋ฐ๊ตฌ๋์ ์ํ์ด ์ฑ์์ก์ ๋ ์ด๋ค ์ก์ ์ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฒ์ธ๋ฐ์. ๊ทธ์ ๊ด๋ จ๋ ๋ฉ์๋๋ฅผ 1๊ฐ์ง ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
2. ์ ํธ๋ฅผ ์ฃผ๋ ์ชฝ - CartViewController(์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ๋ทฐ ์ปจํธ๋กค๋ฌ)
์ ํธ๋ฅผ ์ฃผ๋ ์ชฝ์ CartViewController์ ๋๋ค. ๋ช ๊ฐ์ ์ํ์ด ์ถ๊ฐ๋์๋์ง ์ ํธ(๋ฐ์ดํฐ, ์๋ฆผ ๋ฑ)๋ฅผ ๋๊ตฐ๊ฐ์๊ฒ ์๋ ค์ฃผ๊ณ ์ถ์ ๊ฑฐ์์. ์ค์ํ ๋ถ๋ถ๋ง ๊ฐ์ด ์ดํด๋ด ์๋ค.
delegate ๋ณ์๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ์์ด์. ์ด ์น๊ตฌ๋ ์ฐ๋ฆฌ๊ฐ ์๊น ๋ง๋ค์ด ๋ CartDelegate ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ฃ . ๋ณต์กํ๊ฒ ๋ง๊ณ ๊ฐ๋จํ๊ฒ ์ด๋ค ๊ถํ์ ๋ง๋ค์ด์ฃผ์๋ค๊ณ ์๊ฐํด๋ด ์๋ค.
โ ์ด์ CartViewController์๋ CartDelegate ํ๋กํ ์ฝ์ ๋ํ ๊ถํ์ด ์๊ฒผ์ด์.
์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ๋ฒํผ(insertCartButton)์ ํด๋ฆญํ์ ๋ ํ๋กํ ์ฝ ์ค alarmCartIsFilled()๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ์ด์. ์ธ์๋ก๋ ์ํ์ ๊ฐ์(itemCount)๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์์ด์. ๋ฉ์๋ ์์์ ์ํ์ ๊ฐ์๋ฅผ ์ด์ฉํด ๋ฌด์ธ๊ฐ๋ฅผ ์๋ฆฌ์กฐ๋ฆฌ ์ฒ๋ฆฌํ๊ณ ์ถ์ ๊ฑฐ์์.
๊ธฐ๋ฅ์ ์คํ์ํค๊ธฐ๋ ํ ๊ฑด๋ฐ ์ด๊ฒ๋ ์ ํธ์ ์ผ์ข
์ผ๋ก ์๊ฐํด์ ์ ํธ๋ฅผ ๋ฐ๋ ์ชฝ์ผ๋ก ๊ถํ์ด๋ ์ด๋ฐ ๊ฒ๋ค์ ๋ค ๋๊ฒจ์ค ๊ฑฐ์์. (์คํ์ํฌ๊ฑฐ์ผ ๊ทผ๋ฐ ์ด๋ค ๊ธฐ๋ฅ์ธ์ง๋ ๊ตฌํํ๋ ์ชฝ์์ ์ฐพ์๋ด ~ ์ด๋ฐ ๋๋??) (์๋ฌด๋ง ๋์์น๋ค์..)
class CartViewController: UIViewController {
// ...
var itemCount: Int = 0
var delegate: CartDelegate? // ๊ฐ์ฒด๊ฐ ๊ฐ์ง๋ ์ด๋ค ๊ถํ
// ...
// ์์ดํ
๊ฐ์ ์ฆ๊ฐ/๊ฐ์
@IBAction func stepperValueChanged(_ sender: UIStepper) {
itemCount = Int(sender.value)
itemCountLabel.text = Int(sender.value).description
}
// ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ๋ฒํผ์ ๋๋ ์ ๋
@IBAction func insertCartButtonTapped(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
delegate?.alarmCartIsFilled(itemCount: itemCount) // ๊ถํ ์ค์ ์ด๋ฐ ์ก์
์ ์คํํ ๊ฑฐ์ผ, ์ด๋ฐ ์์ฒญ์ ๋ ๋ฆด๊ฑฐ์ผ
}
// ...
}
์ ์ผ๋จ ์ ํธ๋ฅผ ์ฃผ๋ ์ชฝ์ ๋ง๋ค์์ด์. ์ ํธ๋ฅผ ๋ฐ๋ ์ชฝ๋ ๋ง๋ค์ด๋ณผ๊ฒ์.
3. ์ ํธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ์ชฝ - ViewController(์ํ ๋ทฐ ์ปจํธ๋กค๋ฌ)
์์ธํ ๋ณด๋ฉด 3๊ฐ์ง ํฌ์ธํธ๊ฐ ์์ด์.
- CartDelegate ํ๋กํ ์ฝ์ ์ฑํํ๋ ๋ถ๋ถ
- CartViewController์ delegate๋ฅผ ์์ํ๋ ๋ถ๋ถ
- ํ๋กํ ์ฝ์์ ์ฌ์ฉํ ๋ฉ์๋์ ๊ตฌํํ๋ ๋ถ๋ถ
// ViewController.swift (์ํ ๋ทฐ ์ปจํธ๋กค๋ฌ)
import UIKit
class ViewController: UIViewController, CartDelegate // (1) {
@IBOutlet weak private var productNameLabel: UILabel!
@IBOutlet weak private var priceLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
setUI()
}
private func setUI() {
navigationController?.navigationBar.isHidden = true
}
// (3) ํ๋กํ ์ฝ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๋ถ๋ถ
func alarmCartIsFilled(itemCount: Int) {
let alertVC = UIAlertController(title: "์ฅ๋ฐ๊ตฌ๋ ํ์ธ", message: "์ฅ๋ฐ๊ตฌ๋์ \(itemCount)๊ฐ์ ์ํ์ด ์ถ๊ฐ๋์์ต๋๋ค.", preferredStyle: .alert)
let okAction = UIAlertAction(title: "ํ์ธ", style: .default, handler: nil)
alertVC.addAction(okAction)
present(alertVC, animated: true, completion: nil)
}
@IBAction func cartButtonTapped() {
let cartVC = storyboard?.instantiateViewController(identifier: "CartViewController") as! CartViewController
cartVC.delegate = self // (2) cartVC์ ๊ถํ์ ๋ด๊ฐ ๋์ ํ ๊ฑฐ์ผ
if let productName = productNameLabel.text,
let price = priceLabel.text {
cartVC.productName = productName
cartVC.price = price
}
present(cartVC, animated: true, completion: nil)
}
}
๐๐ปโ๏ธ ์กฐ๊ธ๋ง ๋ ์์ธํ๊ฒ ๋ณด๊ฒ ์ต๋๋ค.
(1) CartDelegate ํ๋กํ ์ฝ์ ์ฑํํ๋ ๋ถ๋ถ
ํ๋กํ ์ฝ์ ์ฑํํ๋ฉด ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ๋ฉ์๋๋ค์ด ์์ด์. ๊ทธ๊ฒ์ ์ถ๊ฐ๋ก ๊ตฌํํด์ฃผ์ด์ผ ํฉ๋๋ค. 3๋ฒ์์ ์ดํด๋ณผ๊ฒ์.
(2) CartViewController์ delegate(๊ถํ)๋ฅผ ์์ํ๋ ๋ถ๋ถ
cartVC.delegate = self // (2) cartVC์ ๊ถํ์ ๋ด๊ฐ ๋์ ํ ๊ฑฐ์ผ
CartViewController์ delegate(๊ถํ)์ self(์๊ธฐ ์์ = ์ฌ๊ธฐ์๋ ViewController)๊ฐ ๋์ ํ๊ฒ ๋ค.
์ด๋ฐ ์๋ฏธ์ ๋๋ค. ์ ๋ง ์ค์ํ ๋ถ๋ถ์ด์์. ๊ถํ์ ๋๊ฐ ๊ฐ์ง๊ณ ์๋์ง ๋ช ์์ ์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ฅ์ ์ ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์.
(3) ํ๋กํ ์ฝ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๋ถ๋ถ
์ฅ๋ฐ๊ตฌ๋์ ๋ช ๊ฐ์ ์ํ์ ๋ด์๋์ง ์๋ฆผ์ ๋์ฐ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๊ฑด๋ฐ, ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ๋ทฐ์์ ๋๊ฒจ์ค ์์ดํ ๊ฐ์(itemCount)๋ฅผ ์ด ๋ ์ฌ์ฉํ๋ ๊ฑฐ์์.
// (3) ํ๋กํ ์ฝ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๋ถ๋ถ
func alarmCartIsFilled(itemCount: Int) {
let alertVC = UIAlertController(title: "์ฅ๋ฐ๊ตฌ๋ ํ์ธ", message: "์ฅ๋ฐ๊ตฌ๋์ \(itemCount)๊ฐ์ ์ํ์ด ์ถ๊ฐ๋์์ต๋๋ค.", preferredStyle: .alert)
let okAction = UIAlertAction(title: "ํ์ธ", style: .default, handler: nil)
alertVC.addAction(okAction)
present(alertVC, animated: true, completion: nil)
}
๐ ๋ง๋ฌด๋ฆฌ
์ฌ์ค ๊ธ๋ก๋ ํฌ๊ฒ ๊ฐ์ด ์ ์กํ ์ ์์ต๋๋ค. ์ง์ ํด๋ด์ผ ํด์. ๊ทธ๋์ผ ์์ ๋ง์ ์ ์๊ฐ ์๊ธฐ๊ณ ์ดํด๊ฐ ์์ฐ์ค๋ ๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ์์๋ก ๋ ์ฐพ์์ฌ๊ฒ์. ์ ๋ Delegate Pattern ์ ๋ฆฌ ์ค์ด๊ฑฐ๋ ์. ํ์ดํ ^__^
'๐ iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] CollectionView Cell ๋๋น ๋์ ์ผ๋ก ์กฐ์ ํ๊ธฐ (8) | 2021.10.28 |
---|---|
[iOS] ์๋ธ ํด๋์ฑ (6) | 2021.10.07 |
[iOS] Associated Type (3) | 2021.09.05 |
[iOS] Typealias, ํ์ ๋ณ์นญ ์ฌ์ฉํ๊ธฐ (3) | 2021.09.02 |
[iOS] ํ ์คํธ์ ํฌํจ๋์ด ์๋ HTMLํ๊ทธ ์ ๊ฑฐํ๊ธฐ (0) | 2021.08.28 |