[iOS][DesignPatterns] 델리게이션 패턴

Uno·2021년 6월 27일
1

iOS 디자인패턴

목록 보기
4/5

Problem


Q. 제가 iOS 프로그래밍을 하는데, 제가 원하는 컨트롤러에서 다른 컨트롤러를 조작하고 싶을 때도 있고, 이전 컨트롤러에 데이터를 주고 싶을 때가 있는데, 어떻게하면 좋나요?

A. 하나의 컨트롤러에서 다른 컨트롤러를 컨트롤 하고 싶다는 말씀이시죠? 여러 가지 방법으로 할 수 있겠습니다만, 이번에 "Delegation Pattern"을 말씀드리겠습니다.

Solution


Q. Delegation Pattern 이면, 대리자 ? 위임패턴? 이게 뭔가요?

A. 설명드리기 앞서 그림을 먼저 보겠습니다.

클래스 다이어그램으로 도식화한 그림입니다. (raywenderlich 의 Design Pattern Book 그림)

그림을 해석해보면, Protocol이 있고 좌우로 화살표가 있습니다.

"Object Needing a Delegate"은 말 그대로 델리게이트가 필요한 객체가 프로토콜을 "사용" 하는 화살표가 되어있죠. (클래스 다이어그램 글이 있는데, 참조해주세요!)

"Object Actng as a Delegate" 은 델리게이트를 행하는 객체 라는 뜻으로, 프로토콜을 "준수 혹은 채택" 하고 있죠.

하나의 프로토콜로 두 개의 객체를 연결했고, 그 중 하나는 델리게이트를 사용하고, 하나는 델리게이트를 구현하죠.

여기서 두 개의 객체는 컨트롤러가 될 수 있습니다. 그래서 하나의 컨트롤러가 다른 컨트롤러를 "사용"하고 나머지 컨트롤러는 "구현" 해주는 상황으로 대입해볼 수 있겠네요.

Delegataion Pattern


델리게이트 패턴은 UIKit 전반적으로 활용되는 패턴입니다.

UITableViewDataSource , UITableViewDelegate 도 이 패턴을 따르고 있죠.

물론 직접 구현할 수도 있습니다.

Q. 근데 왜 Delegat를 두 개로 나눴나요? 그냥 하나에 다 넣으면 안되요?

A. 일단 "애플 마음" 입니다만, 애플이 그렇게 두 개를 구분한 기준이 있습니다.

DataSource 라는 이름을 가진 프로토콜의 경우, "데이터를 제공" 하는 것에 초첨을 맞춰 프로토콜 메소드를 구현했습니다. 그래서 이름이 바뀌더라도 접미사에 DataSource 만 있다면, 어느정도 코드를 이해하기 쉽죠.

마찬가지로 Delegate 라는 이름을 가진 프로토콜의 경우 "데이터를 받거나 이벤트를 받는" 것에 초첨을 맞췄습니다. 그래서 셀을 클릭 하거나 했을 때, 이를 알 수 있도록 메소드를 구현해두기도 했구요.

참고자료)

https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/4-delegation-pattern

profile
iOS & Flutter

0개의 댓글