티스토리 뷰

iOS

[iOS] Delegation Pattern

묵지수 2019. 8. 13. 18:01
이 글은 개인적으로 공부한 내용을 정리한 글입니다. 개인마다 이해한 내용에는 차이가 있을 수도 있으니 감안해주시기 바랍니다.
오타나 내용적으로 부족한 부분에 대한 말씀은 감사하게 받겠습니다!

 

iOS 애플리케이션 개발 시 코코아 터치 프레임워크로, macOS 애플리케이션 개발 시 코코아 프레임워크로 개발을 하고 있습니다.

코코아, 코코아 터치 프레임워크는 내부적으로 몇가지 주요한 디자인 패턴을 채택하여 구현되어 있습니다.

다음은 Apple 개발자 문서에서 제시하고 있는 Common Pattern들 입니다.

 

이 글에서는 Delegation Pattern에 대해서 알아보겠습니다.

 


Delegation?

 

자세히 알아보기 전에 Delegation의 사전적인 정의는 무엇일까요? 네이버에서 검색해봤습니다 :)

delegate
1. (집단의 의사를 대표하는) 대표(자)
2. (권한업무 등을) 위임하다
3. (대표를) 뽑다

무언가를 대표하거나 위임을 하는 경우 delegation을 사용하는 것을 알 수 있습니다.

 

저는 개인적으로 Delegation Pattern을 이해할 때 위임이라는 의미에 초점을 두니 이해하기 쉬웠습니다.

 


 

그럼 개발자 문서의 Using Delegates to Customize Object Behavior 문서를 보면 다음과 같이 간단하게 설명되어 있습니다.

음...

너는 앱의 이벤트에 대해 알려주는 코코아 오브젝트와 상호작용하기 위해 delegate를 사용한다.

즉, 앱에서 어떠한 이벤트(예를 들어 Tap)가 발생하면 다른 오브젝트에게 알려주어 서로 이야기하도록 하는 의미로 생각되네요.

개발자문서에서는 NSWindow Class, NSWindowDelegate protocol, window(_:willUseFullScreenContentSize:) 함수를 예시로 들어 설명하고 있습니다.

 

저는 다른 예시를 들어 저 나름대로 이해하기 쉽게 풀어보겠습니다.

 


 

delegation Pattern을 적용할 때 필요한 구성원들이 있습니다.

 

  • 일을 시키는 객체 (엄마)
  • 일을 하는 객체 (아들)
  • 할 일들이 정의되어 있는 Protocol (부탁)

 

delegate를 위임이라는 의미에 초점을 두면 이해하기 쉬웠다고 위에서 말했습니다.

그 의미를 pattern의 구성원들에 적용시켜서 저 나름대로 이야기로 풀어보겠습니다.

 

엄마방청소를 할 수 있습니다. 또 엄마는 가족 구성원들에게 부탁이라는 것을 할 수 있습니다.
엄마가 매우 힘이 들어서 방청소를 아들에게 부탁할 수 있고 아들은 엄마의 부탁을 받고 직접 방청소를 할 수 있습니다.

 

위 이야기를 delegate 패턴에 적용시켜보면,

 

엄마는 일을 시키는 객체

부탁은 할 일들이 정의되어 있는 Protocol

방청소는 할 일

아들은 일을 하는 객체

 

위와 같이 적용될 수 있습니다.

 

코드를 보면 더 이해하기 쉬울 것 같습니다. 이를 코드로 나타내어 볼까요.

 

제 나름대로 예제 코드를 작성해보면서 확실히 이해하는데 많은 도움이 된 코드입니다.

추후에 부탁할 일들이 더 늘어난다고 하면 Askable protocol에 추가를 해주고 Mom 클래스에 부탁하는 함수를 만들어주면 됩니다.

 

delegation pattern은 iOS앱을 구현하면서 알게모르게 많이 사용되고 있습니다.

예를들면 UIKit의 UITableViewDatasource와 UITableViewDelegate이 그 예입니다.

 

TableView의 cell선택 시 동작 과정을 예로 들어 보겠습니다.

 

TableView의 cell중에 하나가 터치되면 TableView의 UITableViewDelegate 타입인 delegate프로퍼티가 동작을 수행하도록 지시합니다.

즉, cell 선택 event가 발생하고 이에 대한 처리는 UITableViewDelegate protocol을 채택하고 있는 ViewController 너가 해줘! 라고 생각하시면 됩니다.

최종적으로 ViewController에 구현된 UITableViewDelegate에 정의된 함수인 tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)가 호출됩니다.

 


 

그러면 가장 중요한 왜 delegation pattern을 쓸까요?

 

위의 예제에서는 엄마가 아들에게 부탁을 했지만 실제로 딸, 남편 등 다양한 사람에게 부탁할 수 있습니다.

delegation pattern은 이렇게 다양한 상황을 고려하여 재사용성을 높여줄 수 있기에 유용한 방법이라고 생각합니다.

또한 엄마는 단순히 protocol에 정의된 부탁하는 함수를 호출하는 것만을 하므로 아들과의 결합도가 줄어들게 됩니다.

아들이 청소기로 하든 빗자루로 하든 신경을 쓰지 않아도 된다는 것이죠.

 

코드는 다양한 방법으로 작성될 수 있고 제가 위에서 제시한 엄마와 아들 코드도 다른 방법으로 구현될 수 있습니다.

그렇기 때문에 뭐가 좋은 방법이다 그건 안 좋다 이렇게 말할 수 없고 저는 단순히 제가 생각한 장점을 적어보았습니다.

 


 

iOS 앱 프로그래밍을 하다보면 무심코 작성했던 코드들에 delegation pattern이 적용되어 있는 부분이 많다는 것을 느낄 수 있습니다.

이번 기회에 제가 생각했던 내용과 새로 알게 된 내용들을 정리하면서 개념에 대해 확실히 정리하고 넘어가는 계기가 되었습니다.

'iOS' 카테고리의 다른 글

[iOS] Codable  (0) 2019.08.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함