Skip to content

Delegate #1

@simoniful

Description

@simoniful

Delegate 패턴을 사용하면 객체가 별도의 "Helper" 객체를 사용하여 작업 자체를 수행하는 것이 아닌 프로토콜에 근거하여 데이터를 제공하거나 작업을 수행할 수 있습니다. 패턴에는 세 부분이 있습니다.

image

  • Object needing a delegate
    Delegating object라고도 불리는 수신자로 delegate를 가진 객체입니다. 수신자가 순환 참조를 피하기 위해 delegate는 일반적으로 weak 속성으로 보유하게 됩니다.
  • Delegate Protocol
    Delegate가 구현하거나 구현해야 하는 방법을 정의하는 Delegate Protocol입니다.
  • Object Acting as a Delegate
    Delegate. Delegate Protocol을 구현하는 helper 객체입니다.

구체적인 객체 대신 Delegate Protocol에 의존함으로써, 훨씬 더 유연하게 구현이 가능합니다: 프로토콜을 구현하는 모든 객체를 Delegate로 사용할 수 있습니다!

사용

Delegate 패턴을 사용하여 대규모 Class를 분할하거나 generic하고 reusable한 컴포넌트를 만들 수 있습니다. Delegate 관계는 애플 프레임워크, 특히 UIKit에서 일반적이다. DataSource와 Delegate로 명명된 객체 모두 실제로 Delegate 패턴을 따릅니다. 각 개체에는 다른 객체에 데이터를 제공하거나 무언가를 수행하도록 요청하는 작업이 포함됩니다.

왜 애플 프레임워크에는 DataSource, Delegate 두 개의 프로토콜로 구성되어 있을까?

애플 프레임워크는 일반적으로 데이터를 제공하는 Delegate 메서드를 그룹화하기 위해 DataSource라는 용어를 사용합니다. 예를 들어, UITableViewDataSource는 표시할 UITableViewCells를 제공해야 합니다.

Apple 프레임워크는 일반적으로 데이터나 이벤트를 수신하는 메서드를 그룹화하기 위해 Delegate라는 프로토콜을 사용합니다. 예를 들어 행을 선택할 때마다 UITableViewDelegate에 알림이 표시됩니다.

일반적으로 dataSource와 delegate는 UITableView를 소유한 뷰 컨트롤러와 같은 동일한 개체로 설정됩니다. 그러나,반드시 그럴 필요는 없으며, 때때로 다른 객체로 설정하는 것이 유용할 때도 있습니다.

주의 사항

Delegate는 매우 유용하지만 과하게 사용될 수 있습니다. 객체에 대해 너무 많은 Delegate을 만들지 않도록 주의하세요.

객체에 여러 개의 Delegate가 필요한 경우, 이는 객체가 너무 많은 작업을 수행하고 있음을 나타냅니다. 이 경우엔 하나의 catch-all 클래스 대신 특정 사용 사례에 대한 개체의 기능을 세분화하는 것을 고려해야합니다.

산술적으로 기준을 잡기는 어렵고, 황금률이란 없습니다. 하지만, 만약 무슨 일이 일어나고 있는지 이해하기 위해 계속해서 class 사이를 오고 있는 자신을 발견한다면, 그건 너무 많은 것을 한 곳에서 가지고 있다는 신호입니다. 마찬가지로, 특정 Delegate가 왜 유용한지 이해할 수 없다면, 그것은 너무 작은 단위라는 의미고, 너무 잘게 쪼개졌음을 알 수 있습니다.

또한, 순환 참조를 발생할 수도 있기에 주의해야 합니다. 대부분의 경우 Delegate 속성은 weak여야 합니다. 객체에 delegate가 절대적으로 필요한 경우 delegate를 객체의 이니셜라이저에 input으로 의존성을 추가하고 Optional을 통한 ? 대신 !를 사용하여 해당 유형을 강제 언래핑 상태로 표시해보세요. 이렇게 하면 수신자는 객체를 사용하기 전에 대리자를 설정하게 됩니다.

강력하게 참조된 delegate을 만들고 싶은 마음이 들 경우 다른 디자인 패턴이 사례에 더 적합할 수 있습니다. 예를 들어, Strategy 패턴을 대신 사용하는 것을 고려할 수 있습니다.

정리

  • Delegate 패턴은 위임자를 필요로 하는 개체(수신자), Delegate 프로토콜, Delegate의 세 부분으로 구성됩니다.
  • 패턴을 사용하면 대규모 클래스를 분할하고 재사용 가능한 일반 구성 요소를 만들 수 있습니다.
  • 대부분의 사용 사례에서 delegate는 weak 속성이어야 합니다.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions