델리게이트(Delegate) 패턴은 객체 지향 프로그래밍에서 사용하는 디자인 패턴 중 하나로, 특정 객체가 수행해야 할 일을 다른 객체에게 위임하는 방법입니다. 쉽게 말해 A라는 친구가 해야 하는 일을 B 친구에게 넘겨준다고 생각하시면 됩니다. 이것을 위임한다고 표현하고요. 다른 객체로 부터 기능을 위임 받은 객체는 '델리게이트 객체' 라고 하고 아니면 짧게 줄여서 '델리게이트' 라고도 합니다.
델리게이트 패턴으로 구현하는 대표적인 예시로는 테이블 뷰(Table View)가 있습니다. 테이블 뷰는 리스트를 표시할 때 사용하는데 우리가 많이 사용하는 문자앱, 카카오톡을 생각하면 대화방이 쭉 나열 되어 있을 때 그 대화방을 리스트라고 생각하면 됩니다. 쇼핑몰 앱이라고 하면 상품들이 쭉 나열되어 있다고 하면 그것도 리스트가 되는 거죠. 리스트를 누르면 문자앱, 카카오톡은 대화방에 들어가게 될 것이고, 쇼핑몰 앱은 상품에 대한 정보를 자세히 보여주기 위해 해당 항목으로 들어가게 될 것입니다.
이렇게 작업이 다양하기 때문에 현실적으로 모든 경우의 수를 객체 안에 담아둘 수가 없습니다. 그래서 객체 안에는 이런 기능이 하나도 들어가 있지 않기 때문에 테이블 뷰는 항목을 선택 했을 때 어떤 작업을 해야 할지 모릅니다. 그래서 이 부분을 델리게이트 객체에게 대신 처리해 달라고 요청합니다. 그렇기 때문에 테이블 뷰는 어떠한 항목이 선택 되었는지만 알려주고 나머지는 신경 쓰지 않습니다.
iOS 앱 개발에서는 주로 사용자 인터페이스의 동작을 관리하거나, 데이터 전달 등에 활용됩니다.
델리게이트 패턴의 주요 구성 요소는 델리게이트 프로토콜, 델리게이터, 델리게이트가 있습니다. 각 요소에 대해서 조금 더 자세히 살펴보도록 하겠습니다.
- 델리게이트 프로토콜(Delegate Protocol): 델리게이팅 객체가 수행할 메서드를 정의합니다. 이 프로토콜은 델리게이팅 객체가 반드시 구현해야 합니다.
- 델리게이터(Delegator): 일부 작업을 델리게이트에 위임하는 객체입니다. 일반적으로 이는 UI 컴포넌트나 시스템 서비스 등일 수 있습니다.
- 델리게이트(Delegate): 델리게이터가 위임한 작업을 실제로 수행하는 객체입니다. 이는 델리게이트 프로토콜을 준수해야 합니다.
예를 들어, UITableView에서 스크롤하거나 셀을 선택할 때마다 발생하는 동작들은 UITableViewDelegate라는 프로토콜에 의해 정의되고, 해당 동작들은 개발자가 직접 구현한 코드 (즉, 델리게이트) 에 의해 처리됩니다. 소스 코드와 함께 살펴보도록 하겠습니다.
class MyViewController: UIViewController, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// ViewController 자신(MyViewController)을 tableView의 delegate로 설정
self.tableView.delegate = self
}
// UITableViewDelegate 메서드 구현 예시
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("Selected row at \(indexPath.row)")
}
}
위 코드에서 MyViewController 클래스는 UITableViewDelegate 프로토콜을 준수하며(conform to) 테이블뷰 셀 선택 시 발생하는 동작(didSelectRowAt: 메서드)를 직접 처리합니다.
따라서 iOS 앱 개발에서 델리게이트 패턴은 매우 중요한 역할을 하며, 사용자 인터랙션 처리, 데이터 전달, 상태 변화 알림 등 다양한 상황에서 사용됩니다.
감사합니다.
틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!
공감과 댓글 부탁드립니다.
'Apple > Swift' 카테고리의 다른 글
[Swift] guard~let, 디폴트 매개변수 정의, 함수 응용 (0) | 2023.10.11 |
---|---|
[Swift] Raw Values (원시 값) (0) | 2023.10.10 |
[Swift] 지연 저장 프로퍼티(Lazy Stored Properties) (0) | 2023.10.05 |
[Swift] 함수에 대한 개념과 다양한 예시 소스 (0) | 2023.09.29 |
[Swift] 제어문과 다양한 예제 정리 (0) | 2023.09.26 |