-
Delegate 패턴을 활용하는 경우를 예를 들어 설명하시오.개발/ios 2023. 2. 15. 23:56
스터디를 진행하면서 처음 진행했던 질문으로
자바만 해본 저에게 매우 생소하고 애를 먹였던 디자인 패턴 Delegate에 대해 알아봅시다.Delegate의 의미?
- 사전적 의미로는 대리자, 다른 사람에게 권한 따위를 위임하다..
- 두 객체 사이에서 한 객체의 행동을 다른 객체가 해주도록 설계하는 패턴입니다.
구현 방법
- 객체의 역할을 먼저 구분한다.
- 데이터를 전달받고 싶은 객체는 delegate/receiver
- 데이터를 전달하게될 객체는 sender데이터 전달 객체 (sender)
- 내부에 채택한 delegate프로토콜 타입의 프로퍼티(보통 delegate라는 이름) 보유
- 객체 내부에 구현된 메서드에서 해당 delegate의 메서드를 호출합니다.대리 수행 및 데이터 전달받을 객체(delegate/receiver)
struct sender { var delegate : ExDelegate? //보통 옵셔널로 선언 var doSomething() { delegate?.protocolImplementMethod() // 대리자가 존재한다면, 그 대리자가 구현해놓은 프로토콜 메서드를 호출 } }
- sender 객체의 delegate가 자신임을 먼저 알려야 합니다.
- 또, sender에서 프로토콜 메서드를 사용할 수 있도록 프로토콜을 채택 후 구현해줍니다.
struct receiver { sender.delegate = self // 국어 문법대로 이해하자. -> sender 객체의 대리자는 self(receiver객체)이다. } extension receiver : ExDelegate { // 보통 가시성과 역할 분리를 위해 extension에서 프로토콜 채택 후 메서드를 구현해줍니다. protocolImplementMethod() { //구현 } }
UIKit 내부에서의 delegate 패턴
UITextField()의 예시
- sender 객체
UITextField()
와의 상호작용(터치, 값변경 등..) - textField 객체 내부의 메서드에서 delegate변수의 옵셔널 체이닝을 통해 TextFieldDelegate프로토콜 메서드 호출
- delegate(receiver)로 설정되어 있는 객체(주로 viewController)가 호출됨. 해당 객체는 TextFieldDelegate를 채택하여 이런 호출을 받았을 때 어떤 동작을 할지 구현해놓았음.
- textField의 value값 길이 제한, 숫자 입력 금지, 전체 삭제 활성화 등 다양한 동작 가능..
단, 2번의 프로토콜 메서드를 호출하는 부분은 definition에서도 확인불가
- 애플이 상세 구현을 숨겨놓았기 때문에 보는 것은 불가능합니다.
그래서 왜 delegate패턴을 쓰는가?
- 프로토콜 채택을 통해 여러가지 기능들을 구현할 수 있습니다. (추후 언급할 알림과 대조됨)
- sender 객체에서 프로토콜 타입으로 캐스팅 되어 있는 receiver 객체를 프로퍼티로 가짐으로써, receiver의 속성에 접근할 수 있고 sender 자신의 데이터를 할당해줄 수도 있어 데이터 전달에 쓰입니다.
참고 문헌
'개발 > ios' 카테고리의 다른 글
Singleton 패턴을 활용하는 경우를 예를 들어 설명하시오. (0) 2023.02.15