Delegate 패턴은 Swift 언어와 iOS 앱 개발에서 매우 중요한 디자인 패턴 중 하나입니다.
- 이 패턴은 객체 사이의 효율적인 통신과 역할 분담을 위해 사용되며,
객체 간의 결합도를 낮추고 코드의 재사용성과 유지보수성을 높이는데 매우 효과적입니다.
<aside>
📎 Delegate 패턴이란?
delegate : 대리자
- 하나의 객체가 다른 객체의 대리자 역할을 수행하여 특정 이벤트가 발생했을 때 해당 이벤트를 처리하는 디자인 패턴입니다.
- 객체는 자신이 처리하기 어려운 기능이나 작업을 대리자에게 위임함으로써 자신의 역할을 단순화하고 중요한 책임에만 집중할 수 있습니다.
- 객체들 간의 결합도가 낮아지고 유연한 코드를 작성할 수 있습니다.
</aside>
<aside>
♻️ 장정 & 단점
장점
- 프로토콜 사용으로 뛰어난 재사용성
- 프로토콜에 필요한 메서드들이 명확하게 명시되며 정보 전달도 가능
- 객체 지향 프로그래밍을 따름. 로직의 흐름을 따라가기 쉽다
단점
- 많은 줄의 코드가 필요
- delegate 설정에 nil이 들어가지 않게 주의해야함 (크래시를 발생 가능성)
- 많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적임
</aside>
내장 Delegate
- UITextFieldDelegate, UITableViewDelegate, UIWebViewDelegate 등
UITextFieldDelegate 사용
<aside>
🥕 프로토콜 채택하기
textField.delegate = self
- 여기서의 self 는 ViewController의 객체를 말합니다.
- 해석을 하면 textField의 대리자(Delegate)는 ViewController의 객체가 된다는 말이죠. (위임을 한다)
class ViewController: UIViewController, UITextFieldDelegate {
let textField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
// delegate를 대리자로 설정해주기
self.textField.delegate = self
}
}
// 텍스트필드가 뷰컨에게 "작업이 끝났어 END 입력해" 라고 전달
func textFieldDidEndEditing(_ textField: UITextField) {
textField.text = "END"
}
// 텍스트필드가 뷰컨에게 "리턴버튼 누르면 키보드 내려도 돼" 라고 전달
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
}
- 실제로는 UITextField의 동작이지만
ViewController가 메서드를 전달받아 대신 작업을 한다.
- 화면에서의 유저와 UITextField가 커뮤니케이션을 하면UITextField의 동작은 Delegate를 통해서을 ViewController에서 전달받아 수행한다.
쌍방향 의사소통의 개념이죠.
</aside>