[Design Pattern] Delegate Pattern

Delegate Pattern


Delegate Pattern

OOP(객체지향프로그래밍)에서 하나의 객체가 모든 일을 처리하는 것이 아니라 일들 중 일부를 다른 객체에 넘기는 것

  • 효율성 관점에서 아주 중요
    • 기능을 위임할 수 잇는 객체가 있다는 것은 그만큼 직접 구현해야 하는 부분이 적다는 것이기 때문
  • 기능을 처리할 객체를 Delegate로 설정하고, 특정 이벤트가 발생할 때 이를 Delegate에 의해 위임된 본래의 객체로 전달해 줌
데이터를
받을 View
<->데이터를
전달할 View
- 프로토콜 채택
- 실제 구현
- 대리자 위임
<->- 타입이 프로토콜인
프로퍼티 생성
- Delegate 사용

사용하는 경우

  • 하나의 객체가 해야하는 일이 여러가지일 경우
  • 수신 받는 객체가 많을 때, 콜백 블럭을 받기 위한 목적이 분명할 경우
  • 내부의 블록을 호출시키는 코드를 읽고 다시 돌아와서 추적할 일이 없는 경우

사용하는 이유

  • Delegation은 한 클래스와 다른 클래스의 상호작용을 간단히 할 수 있도록 도움
  • 클래스 간 요구 사항을 전달해주는 프로토콜만 있으면 연결 수월해 짐
  • 완전한 클래스 또는 구조체를 상속할 필요가 없기 때문에 더욱 가볍게 사용할 수 있음
  • Delegate Pattern은 1:1 관계에서 매우 유용
    (1:N 또는 N:N 관계에는 Observer Pattern이 유용)
  • 델리게이트는 프로토콜을 준수하는 것 만으로 구현이 가능하므로 매우 유연
  • 제어하지 않는 코드 내에서 발생하는 이벤트를 연결할 수 있는 좋은 방법

사용 시 유의점

  • Delegate Pattern은 굉장히 유용하지만, 과도하게 사용될 위험성이 존재
    • 객체에 너무 많은 위임을 생성하지 않도록 주의 
  • 강한 참조 순환이 발생하지 않도록 유의
    • 보통 Delegate 프로퍼티의 경우 weak으로 선언

장점과 단점

장점

  • 재사용할 수 있는 코드를 작성 가능 (프로토콜의 장점)
  • 매우 엄격한 Syntax로 인해 프로토콜에 필요한 메서드들이 명확하게 명시
  • 컴파일 시 경고나 에러가 떠서 프로토콜의 구현되지 않은 메소드들을 알려줌
  • 로직의 흐름을 따라가기 쉬움
  • 프로토콜 메소드로 알려주는 것 뿐만 아니라 정보를 받을 수도 있음
  • 프로토콜이 컨트롤러의 범위 안에서 정의된다.

단점

  • Delegate 사용을 위해 구현해야 하는 코드가 많음
    • 다수의 객체들에게 이벤트를 호출하는 방식이 비효율적
    • 1:N 또는 N:N 관계에는 Observer Pattern이 적합
  • delegate 설정에 nil이 들어가지 않게 주의해야한다. 크래시를 일으킬 수 있다.

Delegate Pattern 예시

붕어빵 장사를 예로 든다면

Continue reading

Pagination


© 2021. by hminkim