적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Cocoa Design Pattern] Delegation Pattern

hongssup_ 2022. 12. 22. 16:50
반응형
딜리게이트 패턴이란 

 

딜리게이트 패턴이란?

델리게이트는 어떤 객체가 해야 하는 일을 부분적으로 확장해서 대신 처리를 한다.

객체는 Delegate라는 헬퍼 객체를 만들어 권한을 위임함으로써 요청을 처리

delegate 대신 처리를 수행할 객체와 처리를 요청하는 객체로 구성된다?

왜 사용?

 to Customize Object Behavior

코드를 재사용하고 유지보수하기 쉬워진다?

delegate는 일을 시킬 뿐, 어떻게 처리해야 하는지 일의 처리 방법은 그 일을 수행하는 객체에 구현. 

어떤 일을 해야 하는지 미리 정해놓기만 하고, 처리를 할 때 상황에 맞는 코드를 작성하면 된다.

예를 들어 동일한 작업인데도 불구하고 객체마다 다른 내용을 처리해야할 때, 프로토콜에는 어떤 일을 해야 하는지 미리 정해놓기만 하고 구체적인 내용은 전달 받은 객체에서 처리하기만 하면 된다. (예를들어..?)

객체들의 역할과 책임을 나눔으로써 객체들은 서로 요청/응답만 하는 과정을 거치며, 결국에는 의존성을 낮출 수 있다

사용 방법?

delegate protocol 만들어 필요한 메서드 선언하기

처리 요청 객체에 delegate 생성

대신 처리를 수행할 객체에 앞서 만들어준 delegate protocol 위임해주고, 프로토콜에 정의된 메서드 구현해주기 + 대리자 설정

사용 예시?

TableViewDelegate / CollectionViewDelegate 흔히 많이 사용. 

커스텀 경험

상품 상세 페이지 화면에서 컬렉션 뷰 헤더로 탭 바(상품정보, 리뷰, 문의/안내)를 만들 때, Delegate protocol을 만들어 탭 변경 이벤트 처리를 해주었다. 

대신 처리를 수행할 객체 : ShoeDetailTabHeader, 처리 요청 객체 : DetailTabControlView ??

protocol DetailTabControlViewDelegate: AnyObject {
    func tabControl(didChange index: Int)
}

class DetailTabControlView: UIView {
    var titles = ["상품정보", "리뷰", "문의/안내"]
    var delegate: DetailTabControlViewDelegate?
    ...
}
class ShoeDetailTabHeader: UICollectionReusableView, DetailTabControlViewDelegate {
    let detailTabControlView = DetailTabControlView()
    detailTabControlView.delegate = self
    
    func tabControl(didChange index: Int) { … }
}

딜리게이트 패턴을 쓰는 것이 최선의 방법이었는지는 잘 모르겠다. Rx 옵저버 같은거 이용해서 이벤트 처리를 좀 더 잘 할 수도 있을거같은데.. 

사실 이렇게 사용하는 게 옳은 방법인지도 잘 모르겠다. 적절한 예시인지도 모르겠다. 

 

 


참고 : 

- https://developer.apple.com/documentation/swift/using-delegates-to-customize-object-behavior

- https://velog.io/@zooneon/Delegate-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

- https://shark-sea.kr/entry/swift-delegate%ED%8C%A8%ED%84%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

- https://leechamin.tistory.com/550

 

728x90
반응형