ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Delegate 패턴을 활용하는 경우를 예를 들어 설명하시오.
    개발/ios 2023. 2. 15. 23:56

    ios 면접 레포지토리 링크

    스터디를 진행하면서 처음 진행했던 질문으로
    자바만 해본 저에게 매우 생소하고 애를 먹였던 디자인 패턴 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()의 예시

    1. sender 객체 UITextField()와의 상호작용(터치, 값변경 등..)
    2. textField 객체 내부의 메서드에서 delegate변수의 옵셔널 체이닝을 통해 TextFieldDelegate프로토콜 메서드 호출
    3. delegate(receiver)로 설정되어 있는 객체(주로 viewController)가 호출됨. 해당 객체는 TextFieldDelegate를 채택하여 이런 호출을 받았을 때 어떤 동작을 할지 구현해놓았음.
    4. textField의 value값 길이 제한, 숫자 입력 금지, 전체 삭제 활성화 등 다양한 동작 가능..

    단, 2번의 프로토콜 메서드를 호출하는 부분은 definition에서도 확인불가

    • 애플이 상세 구현을 숨겨놓았기 때문에 보는 것은 불가능합니다.

    그래서 왜 delegate패턴을 쓰는가?

    • 프로토콜 채택을 통해 여러가지 기능들을 구현할 수 있습니다. (추후 언급할 알림과 대조됨)
    • sender 객체에서 프로토콜 타입으로 캐스팅 되어 있는 receiver 객체를 프로퍼티로 가짐으로써, receiver의 속성에 접근할 수 있고 sender 자신의 데이터를 할당해줄 수도 있어 데이터 전달에 쓰입니다.

    참고 문헌

    애플 공식 문서

    Swift 공식 가이드북

    댓글

Designed by Tistory.