Delegate 패턴

suojae·2023년 12월 1일
0

UIKit

목록 보기
2/6

델리게이트 패턴이란?

  • A객체가 할 일을 B객체가 대신 처리해주는 패턴을 Delegate(위임) 패턴이라고 한다
  • 이렇게 A객체의 할 일을 위임받는 B객체를 Delgate Object 혹은 Delegate 라고 부른다

왜 델리게이트 패턴을 사용할까?

저녁식사 초대 예시 (테이블뷰)

만약 내가 저녁 디너 파티를 주최했다고 해보자. 여러 음식들을 손님들에게 대접해야한다. 하지만 내가 모든 것을 준비하기에는 너무 귀찮다! (INTP특)

요리셰프(DataSource)
데이터 소스라는 객체에게 요리준비하라고 명령한다
이때 요리셰프는 어떻게 요리를 배치할지는 신경쓰지 않는다. 단지 스파게티, 피자 등 음식만 만들어내면 된다

웨이터(Delegate)
웨이터라는 객체에게는 손님 대접을 명령한다
손님의 음식 추가 오더를 받고 손님의 요구에 따라 음식을 서빙한다

이와 같이 객체를 만들어 내가 할 일 을 대신 시킴으로써 나 자신을 가볍게 하고 책임과 역할 분리를 명확하게 할 수 있다!!


대표적인 델리게이트 예시 - 테이블 뷰

  • 테이블뷰는 각 셀이 탭하면 어떤 행동을 할 지에 대한 액션을 델리게이트에 위임했다
  • 따라서 테이블뷰는 단지 어떤 항목이 선택되었다! 라는 것만 알려주고 이벤트를 델리게이트에게 던진다
  • 테이블 뷰 안의 객체에는 이름이 delegatedataSource로 끝나는 속성들이 있다
  • dataSource: 테이블뷰의 셀이 몇개인지등 테이블 뷰의 정보를 dataSource 객체에게 위임했다
  • delegate: 테이블뷰가 이벤트가 발생한 사실을 델리게이트에게 토스한다

작업을 부탁(위임)하는 방법

  • 작업을 위임하기 위해서는 메서드를 호출해야한다
  • 하지만 특정 메서드의 글자가 하나라도 틀리면 안되기 때문에 보통 프로토콜로 선언되어 있다
  • 따라서 델리게이트 객체들은 프로토콜에 선언되어 있는 대로 메서드를 호출하게 된다
  • 보통 메서드들은 개발자가 필요한 시점에 호출되지만 델리게이터 패턴으로 구현한 메서드는 개발자가 직접호출하지 않는다!! (중요)

테이블 뷰의 동작방식

  • 테이블뷰에 터치이벤트가 발생하면 테이블 뷰 자체는 이를 스스로 처리할 수 없어 델리게이트 객체에게 이벤트를 던진다
  • 즉 개발자가 델리게이트 객체의 메서드를 호출하는게 아닌 테이블 뷰가 객체 자신이 필요한 시점에 델리게이트 오브젝트 객체의 메서드를 호출하는 것이다

예외 처리

델리게이트 패턴에서 예외상황은 아래와 같이 세 가지가 있다

  1. 반드시 위임해야할 이벤트가 발생했는데 부탁(위임)할 객체가 없는 상황
    -> 앱 크래쉬 발생!
    -> 예를 들어 데이터소스가 없으면 테이블 뷰에 몇개를 표시해야할지 모름

  2. 위임할 객체가 있지만 객체가 토스받은 이벤트를 처리하지를 못하는 상황, 즉 위임받은 이벤트에 대한 객체만 있고 내부에 메서드 구현이 안되어있는 상황
    -> 컴파일 에러발생!

  3. 반드시 처리해야할 이벤트는 아니지만 위임할 객체가 없는 경우, 예를들어 셀을 탭하면 후속동작이 없어도 되는 케이스
    -> 에러 처리 안되고 그냥 이벤트 발생시 아무런 변화 없음


애플이 만들어준 델리게이트 패턴 구현 방법 3 Step

Fisrt Step

개발자 문서를 통해 필수적인 이벤트를 처리하는 델리게이트를 확인한다
(안넣으면 크래쉬나기 때문에)

Second Step

명령을 내리는 객치와 명령을 받는 객체를 연결한다.
스토리보드, 코드로 연결해준다

Third Step

마지막으로 델리게이트로 지정한 객체에서 프로토콜로 선언되어 있는 필수 메서드를 구현하면 끝!

profile
Hi 👋🏻 I'm an iOS Developer who loves to read🤓

0개의 댓글