iOS/Swift

[Swift] Delegate Pattern(๋”œ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด)์— ๋Œ€ํ•ด์„œ

๊ฒฝํ‘ธ 2023. 4. 4. 18:30
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”~

 

์˜ค๋Š˜์€ Delegate Pattern์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค : )

 

Swift์˜ Delegate Pattern์ด๋ž€?

Swift์—์„œ Delegate Pattern์€ ๊ฐ์ฒด ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์€ ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

Delegate๋Š” ํ”„๋กœํ† ์ฝœ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœํ† ์ฝœ์€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์ž์‹ ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„๋œ ๋ฉ”์„œ๋“œ๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด์—๊ฒŒ ํ˜ธ์ถœ๋˜๋ฉฐ

์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด Delegate Pattern์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ํ”„๋กœํ† ์ฝœ ์ •์˜ํ•˜๊ธฐ

๋จผ์ €, ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” MyViewDelegate๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋กœํ† ์ฝœ์€ didTapButton()์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

protocol MyViewDelegate: AnyObject {
   func didTapButton() 
}

 

2. Delegate ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

๋‹ค์Œ์œผ๋กœ, ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” MyViewController ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด ํด๋ž˜์Šค๋Š” MyViewDelegate ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. didTapButton() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•ด๋ด…์‹œ๋‹ค.

class MyViewController: UIViewController, MyViewDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myView = MyView()
        myView.delegate = self
        
        view.addSubview(myView)
        myView.snp.makeConstraints { make in
           make.edges.equalToSuperview()
        }
    }
    
    func didTapButton() {
        print("Button tapped!")
    }
}

myView.delegate = self๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์•Œ๊ฒŒ ๋˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ self๋Š” MyViewController ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

์ฆ‰, MyViewController ๊ฐ์ฒด๊ฐ€ MyView ๊ฐ์ฒด์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ(๋Œ€๋ฆฌ์ž)๋กœ ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์—์„œ, ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

MyViewDelegate ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ๊ฐ์ฒด๋Š” MyView ๊ฐ์ฒด์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

 

๋”ฐ๋ผ์„œ, MyViewController ๊ฐ์ฒด๊ฐ€ MyViewDelegate ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, MyViewController ๊ฐ์ฒด๊ฐ€ MyView ๊ฐ์ฒด์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•˜๋ฉด myView.delegate = self ์ฝ”๋“œ๋Š” MyView ๊ฐ์ฒด์˜ delegate ํ”„๋กœํผํ‹ฐ์— MyViewController ๊ฐ์ฒด(self)๋ฅผ ํ• ๋‹นํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ, MyView ๊ฐ์ฒด์—์„œ ๋ฒ„ํŠผ์„ ํƒญํ•  ๋•Œ๋งˆ๋‹ค, MyViewController ๊ฐ์ฒด์˜ didTapButton() ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด, MyViewController ๊ฐ์ฒด์—์„œ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

3. ๋ทฐ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ, MyView ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ํด๋ž˜์Šค๋Š” UIButton์„ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฒ„ํŠผ์ด ํƒญ๋˜๋ฉด didTapButton() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

class MyView: UIView {
    
    private let button = UIButton()
    weak var delegate: MyViewDelegate?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        button.setTitle("๋‚˜๋Š” ๋ฒ„ํŠผ", for: .normal)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        
        addSubview(button)
        
        button.snp.makeConstraints { make in
           make.width.equalTo(44)
           make.height.equalTo(44)
           make.center.equalToSuperView()
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    @objc func buttonTapped() {
        delegate?.didTapButton()
    }
}

์ค‘์š”ํ•œ ๊ฒŒ ์žˆ๋„ค์š”.

delegate ๊ฐ์ฒด๋ฅผ weak๋กœ ์„ ์–ธํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋‘˜ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋ง์”€๋“œ๋ฆฌ๋ฉด delegate ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

 

๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์—์„œ ๊ฐ์ฒด A๊ฐ€ ๊ฐ์ฒด B๋ฅผ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ฐ์ฒด B๋Š” ๊ฐ์ฒด A์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ด๋•Œ, ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด๊ฐ€ ๊ฐ์ฒด A๋ณด๋‹ค ๋” ์˜ค๋ž˜ ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ, ๊ฐ์ฒด A๊ฐ€ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด, ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์‚ด์•„๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•ด ๋ณด๋ฉด weak๋กœ ์„ ์–ธํ•˜์—ฌ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋„๋ก ํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 


 

์˜ค๋Š˜์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณต์Šตํ•  ๊ฒธ Delegate Pattern์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ดค์Šต๋‹ˆ๋‹ค~

์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ๋Š” ๋ญ” ์†Œ๋ฆฌ์ธ๊ฐ€ ์‹ถ์–ด ์‚ฌ์šฉ๋„ ๋ชปํ•ด๋ดค๋Š”๋ฐ

์ด์ œ๋Š” ํŽธ์•ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋„ค์š” : )

 

์•„๋ฌด์ชผ๋ก ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋งŒ ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป

๋ฐ˜์‘ํ˜•