# Delegate, Delegation 이란?
사전적의미
Delegate
명사: (집단의 의사를 대표하는) 대표(자)
동사: (1)(권한업무 등을) 위임하다 (2)(대표를) 뽑다[선정하다]
Delegation
명사: (1)대표단 (2)위임
iOS에서의 사용
- 이벤트 발생시 약속된(protocol) 컨트롤러에게 알림이 가도록 되어있는 리모컨으로 묘사
- 리모컨과 TV 라고할 때 리모컨의 ON버튼은 TV를 ON하는것으로 약속되어있다
- 따라서 리모컨의 ON버튼이 클릭 될 시, TV라는 컨트롤러에서 ON이라는 함수가 실행된다. 여기 ON이라는 함수 안에는 TV를 출력하는 로직이 있다.
Delegation Degisn Pattern
- 하나의 객체가 다른 객체를 대신하여 동작 또는 조정할 수 있는 기능을 뜻함
- 주로 프레임워크 객체가 위임을 요청하며, (주로 애플리케이션 프로그래머가 작성하는)커스텀 컨트롤러 객체가 위임을 받아 특정 이벤트에 대한 기능을 구현합니다.
- 델리게이션 디자인 패턴은 커스텀 컨트롤러에서 세부 동작을 구현함으로써 동일한 동작에 대해 다양한 대응을 할 수 있게 해줍니다.
# 소스코드 예제
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate & UINavigationControllerDelegate {
lazy var imagePicker : UIImagePickerController = {
let picker: UIImagePickerController = UIImagePickerController()
picker.sourceType = .photoLibrary
picker.delegate = self
return picker
}()
@IBOutlet weak var imageView: UIImageView!
@IBAction func touchUpSelectImageButton(_ sender: UIButton) {
self.present(self.imagePicker, animated: true, completion: nil)
}
// 이미지피커창이 종료될 때
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
print("이미지 창 종료!!")
self.dismiss(animated: true, completion: nil)
}
// 이미지 선택시
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
print("이미지 선택!!")
if let originalImage: UIImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
self.imageView.image = originalImage
}
self.dismiss(animated: true, completion: nil)
}
}
# 결과
# 소스코드를 대입하여 다시 설명
위에 소스는 ImagePicker와 VC를 연결하는것으로 Delete부분은 ImagePicker에 선언되어있는 아래 두개 함수를 선언
(1) 이미지창이 종료될 때: func imagePickerControllerDidCancel
(2) 이미지가 선택될 때: func imagePickerController
lazy var imagePicker 라는 UIImagePickerController의 인스턴스 변수를 생성
그리고 중요한 부분은
picker.delegate = self
여기 부분으로 해석하자면 ImagePickerController가 Self에게 이벤트를 처리하는 대리인역할을 위임 하였고 이를 self에 해당되는 ViewController가 위임을 받는다.
- 위에 적은 '하나의 객체가 다른 객체를 대신하여 동작 또는 조정할 수 있는 기능을 뜻함' 이 여기에 해당된다
- ImagePickerController 와 ViewController는 위임(delegate)선언으로 서로 연결되었다
- 리모컨(ImagePicker) 이고 TV(Self: ViewContorller)에 해당된다
- 리모컨에는 두개의 이벤트(이미지창 종료, 이미지 선택)가 있다
- 따라서 리모컨(ImagePicker)이벤트 발생시 연결된 TV에 맞는 이벤트함수(이미지 창 종료 또는 이미지선택)에 자동으로 연결이된다.
처음에는 바로 와닿지않았는데 다시 하나하나 읽다보니 이해되었고 리모컨과 TV라는 비유로 대입하였더니 좀 더 쉽게 이해되었다.