Delegate 패턴 이해하기

KKANG·2021년 8월 17일
0
post-thumbnail

Delegate 패턴

Delegate는 Swift의 디자인 패턴 중 하나로 대부분 protocol로 구현되어있다.

Delegate 패턴은 간단하게 말해서 자신의 함수를 호출할 수 있는 권한(함수 호출 뿐만 아니라 객체 자체의 권한)을 다른 객체에게 위임한다는 의미이다. 주로 View Controller가 다른 객체를 Delegate 객체로 사용하는데, 다른 객체 내에 Delegate Protocol을 정의하고 해당 객체에서 원하는 시점에 View Controller의 함수를 대신 호출하게된다.

Delegate 객체가 그 객체의 내부 상황을 더 잘 알고있기 때문에 개발자의 의도에 맞게 함수가 호출되어야하는 타이밍에 맞추어 본 객체의 함수를 대신해서 호출해준다.

예시

UITextFieldDelegate가 동작하는 방식을 예로 들어보자.

protocol UITextFieldDelegate {
	func textFieldDidBeginEditing()
}

class myViewController: UITextFieldDelegate {
    // 1. UITextField 인 변수 선언
    let textField = UITextField()
    // 2. UITextField의 delegate를 이 ViewController로 설정
    textField.delegate = self
    
    // 4. 구현된 textFieldDidBeginEditing()이 실행됨
    func textFieldDidBeginEditing {
    	// do something
    }
}

//(애플 소유의 코드임으로 내부 구현방식 확인할 순 없음)
class UITextField: UIControl {
    var delegate: UITextFieldDelegate
    // 3. UITextField가 text가 써지고있음을 인식하여 delegate의 textFieldDidBeginEditing 호출
    delegate.textFieldDidBeginEditing()
}            

먼저, myViewController는 Delegate protocol을 적용하여 Delegate가 선언해둔 함수를 수행할 수 있도록 함수내용이 구현되어야한다.

1. UIKit 내부의 UITextField() 변수를 선언하고 그 객체의 delegate property를 사용할 것이다.

2. UITextField 객체는 내부에서 Delegate protocol이 적용된 객체를 myViewController로 설정하고

3. 알맞는 타이밍에 delegate 할 객체의 함수, 즉, myViewController의 구현된 함수를 호출해준다. (수행하라고 알려주기만 함)

4. 결과적으로 myViewController에서 UITextField 객체가 수행하라고 알려준 함수가 수행된다.

myViewController에서는 textField 입력이 시작되는지 알 수 없지만 UITextField 객체 내부에서는 알 수 있기 때문에 시작 시점에 위임받은 권한으로 myViewController의 textFieldDidBeginEditing 함수를 호출할 수 있는 것이다!

profile
재밌게 잘하자

0개의 댓글