[Swift] 대리개이션

GUNDY·2023년 11월 27일
1

대리출석이개.

오늘 알아볼 것은 Swift의 프로토콜을 사용할 수 있는 주요 디자인 패턴인 Delegation이다.

Delegation is a design pattern that enables a class or structure to hand off (or delegate) some of its responsibilities to an instance of another type.

쉽게 말하자면 내가 할 일 일부를 다른 누군가에게 떠넘기는 위임하는 것이다.

누가 대리인 delegate로 오든 조건만 만족한다면 상관없기 때문에 원하는 자격요건을 프로토콜로 정의하여 사용하는 것이다.

프로토콜이 뭔데?
프로토콜은 특정 작업에 적합한 메서드, 프로퍼티 및 기타 요구사항 등을 정의할 수 있는 타입의 청사진이야. 이 요구사항을 실제 코드로 구현하기 위해 각 타입들은 프로토콜을 채택할 수 있는데, 조건을 만족하는 타입은 프로토콜을 준수한다고 표현한다.

대리? 위임? 이게 뭔 소리야?

이 Delegation 패턴 구현의 간단한 예제는 공식 문서에 나와있으니 구현 자체는 패스하고 개념에 대한 설명을 조금 더 해보겠다.

쉽게 말하자면 자격증 내지는 면허증같은 느낌이다.

가령 운전을 맡기려면 그 사람에게 운전 면허가 있어야 할 것이고, 의원을 개원하려면 의사 면허가 있어야 할 것이다.

~Delegate 프로토콜이라는 면허를 취득(채택 및 준수)한 사람(객체)만 내 대리인으로 지정할 수 있다는 뜻.

Delegation의 매커니즘

The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled.

특정 이벤트를 수행하기 전이나 수행한 후에 대리자 객체에게 메시지를 보내는 것(메서드 호출 등)이 주요 매커니즘이다.

프로토콜 자체에는 그 메시지가 왔을 때 어떻게 응답할 것인지는 지정되어 있지 않기 때문에 준수 타입별로 다르게 정할 수 있다.

코코아 프레임워크에서 Delegation

The delegating object is typically a framework object, and the delegate is typically a custom controller object.

위임하는 객체는 일반적으로 프레임워크의 객체이고, 위임을 받는 대리자 객체는 일반적으로 컨트롤러 객체이다.

테이블뷰: 오! 이 셀이 눌렸어.

예를 들면 UITableView는 셀을 보여줄 뿐 셀이 터치됐을 경우 어떤 동작을 수행할지는 알지 못한다.

하지만 UITableViewDelegate를 채택한 객체에서 tableView(_:didSelectRowAt:)를 구현해주면 특정 셀이 클릭됐을 때 할 행동을 지정해줄 수 있다.

그런 다음 그 객체를 테이블뷰의 delegate 프로퍼티에 할당해주면 정상적으로 동작한다.

그런데 왜 프레임워크 객체 & 컨트롤러 객체래?

UIKit에는 UITableViewDelegate를 기본적으로 채택하고 있는 클래스가 있다.

바로바로 UITableViewController!

그게 아니더라도 흔히 사용하는 방식은 해당 테이블뷰를 갖고 있는 뷰컨트롤러에 UITableViewDelegate 채택시켜서 쓴다.

그러다보니 프레임워크의 뷰객체 & 뷰컨트롤러 객체의 단짝 조합이 주로 쓰인다고 해석할 수 있겠다.

테이블뷰에는 DataSource란 것도 있던데 이건 뭐야?

Delegate와 마찬가지로 위임을 받는 객체다. Delegate와 아주 흡사한데, 위임하는 객체와의 관계가 약간 다르다. Delegate는 주로 UI에 대한 제어를 위임받는다면 DataSource는 데이터에 대한 제어를 위임받는다.

단적인 예시로 볼 수 있는 큰 차이는 UITableViewDelegate는 필수 구현할 메서드가 하나도 없고 필요한 것만 구현해주면 된다.

하지만 UITableViewDataSource는 테이블뷰가 참조를 유지하면서 때때로 표시해야 할 데이터를 요청하기 때문에 필수로 구현해야하는 메서드가 있다는 것이 큰 차이다.

편의상 이름을 구분하여 역할을 구분했지만 디자인 패턴의 범주에서 보면 둘다 Delegation 패턴이다.

마무리

오늘은 위임을 주고받는 Delegation 패턴에 대해 알아보았다.

특정 상황에서 어떻게 해야할지 미리 설정하지 않더라도 대리자에게 떠넘길 수 있는 게 마치 내 개인 비서 Siri를 부리는 느낌이랄까.

profile
개발자할건디?

0개의 댓글