Delegate
Delegate 단어의 뜻
사전적 의미로 위임하다, 대리자라는 뜻을 갖고 있습니다.
객체 지향 프로그래밍에서
쉽게 말해서 델리게이트 패턴은 하나의 객체가 모든 일을 처리하는 것이 아니라
처리해야 할 일 중 일부를 다른 객체에게 위임한다는 거죠.
즉, 객체와 객체 간 쌍방향 커뮤니케이션의 방법입니다.
Delegate 패턴은
데이터 전달 혹은 작업을 하는 데 처리하는데 있어 작업이 많아
원래 일을 처리해야 할 녀석이 아닌
다른 컨트롤러에게 대신 수행하도록 시키는 것이죠!
장점
프로토콜 사용으로 뛰어난 재사용성.
프로토콜에 필요한 메소드들이 명확하게 명시되며 정보 전달도 가능.
객체 지향 프로그래밍을 따름. (처리할 일의 일부를 다른 객체에게 위임함)
로직의 흐름을 따라가기 쉬움.
단점
많은 줄의 코드가 필요.
delegate 설정에 nil이 들어가지 않게 주의해야함. (크래시를 발생 가능성)
많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적임.
만드는 순서
Swift 내의 구현된 Delegate 프로토콜
기본적으로 Swift에서는 여러 가지 Delegate 프로토콜들이 존재합니다.
(UITextFieldDelegate, UITableViewDelegate, UIWebViewDelegate...)
예시로 UITextFieldDelegate를 사용해 봅시다.
1. 프로토콜을 채택하기
ViewController에 사용할 UITextFieldDelegate에 채택을 한 후
현재 ViewController를 대리자로 설정해 줍니다.
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
}
}
2. 메서드를 구현하기
Swift에서 기본 구현되어 있는 Delegate 프로토콜들은
UITextFieldDelegate 공식문서 만 봐도 이렇게 많이 메서드가 존재합니다.
이렇듯 기본 Delegate 프로토콜의 메서드들은
이미 애플이 잘 만들어 놓았고 우리는 목적에 맞게 선택하여 사용하면 된다.
이와 같이 사용할 메서드를 재정의 해주면 됩니다.
// 텍스트필드가 뷰컨에게 "작업이 끝났어 END 입력해" 라고 전달
func textFieldDidEndEditing(_ textField: UITextField) {
textField.text = "END"
}
// 텍스트필드가 뷰컨에게 "리턴버튼 누르면 키보드 내려도 돼" 라고 전달
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
}
위의 UITextField를 통해 원리를 간단하게 설명하자면
실제로는 UITextField의 동작이지만
ViewController가 메서드를 전달받아 대신 작업을 한다.
다른 말로
화면에서의 유저와 UITextField가 커뮤니케이션을 하면
UITextField의 동작은 Delegate를 통해서을 ViewController에서 전달받아 수행한다.
쌍방향 의사소통의 개념이죠.
Custom Delegate 프로토콜
순서만 설명하고
다음 글에 자세히 Custom Delegate를 다뤄보겠습니다.
위랑 방법은 비슷합니다.
다만 직접 프로토콜을 구현해줘야 하죠.
다음으로 동작을 정의해 준 뒤 대리자 설정을 해주면 됩니다.
큰 순서는 이와 같습니다.
1. 프로토콜을 구현하기
2. 동작을 하도록 메서드를 정의
3. 객체의 대리자 설정하기
자세한 Custom Delegate 패턴(코드)이 궁금하다면 여기를 클릭하세요.
'UIKit > Swift' 카테고리의 다른 글
[iOS/Swift] 디버깅을 통해 메모리 누수를 찾아보자(Debug, Memory Leaks) (0) | 2023.02.17 |
---|---|
[iOS/Swift] MVVM 패턴의 Data Binding에 대해서 알아보자! (Closure, Observable, Combine) (0) | 2023.02.14 |
[iOS/Swift] UINavigationBar 사용 방법 (0) | 2023.02.07 |
[iOS/Swift] UINavigationController 살펴보기 (0) | 2023.02.06 |
[iOS/Swift] UITextField 설정 (0) | 2022.12.20 |