❓ Delegate와 DataSource의 차이
안녕하세요!
벌써 월요일이라니 아쉬운 Yunie입니당..
오늘은 CollectionView와 TableView, TextField 등에 자주 사용하는 Delegate와 Datasource의 차이가 어떤 것이 있는지 알아보겠습니다!
만약 저처럼 기계적으로 둘을 사용했다면 이번 기회에 둘이 어떤 역할을 맡고 있는지 알아가시는 것도 좋을 것 같습니다! 🤗
❓Delegate / Datasource
일반적으로 우리는 TableView, CollectionView를 그릴 때 이 둘을 모두 사용하게 됩니다
그럼 Delegate만 가지고 있고 Datasource는 없는 친구들도 있나요?라고 하신다면! TextField와 TextView가 그 대표적인 예시라고 할 수 있습니다
그럼 이 둘이 어떤 차이가 있길래 누구는 Delegate만 있고 누구는 Delegate와 Datasource 모두 사용하는 걸까요?
천천히 하나씩 알아가 보겠습니다!
❓Delegate
Delegate를 번역하면 ‘대리자’라고 합니다
이게 어떤 의미냐~라고 하면 정말 말 그대로 TableView, CollectionView가 할 일을 대신해주는 역할을 의미한다고 보시면 됩니다
그럼 우리가 항상 사용하는 코드!
tableView.delegate = self
이 코드는 곧 tableView가 본인의 일을 대신해줄 친구를 구하는데 그게 나, ViewController야!라는 의미입니다
그럼 이제 이 Delegate가 어떤 역할을 하는지 알아볼게요
Delegate만 가진 친구들이 누가 있다고 했죠? TextField, TextView입니다
그럼 둘은 어떤 공통점을 가지고 있나요? 그리고 TableView와 CollectionView 이 둘과의 공통점은 어떤 게 있나요?
바로 이 모든 요소들은 사용자와 상호작용이 이루어진다는 점입니다
사용자가 텍스트를 입력하기 위해 TextField 또는 TextView를 터치하는 순간, 텍스트를 입력하는 모든 순간을 사용자와의 상호작용이라고 볼 수 있습니다
또한, CollectionView, TableView도 각 셀을 선택하고 해제하는 등의 액션도 이에 포함됩니다
이처럼 Delegate는 사용자의 액션(동작)에 관한 것들을 정의해 주는 역할을 맡고 있습니다!
그리하여 아래와 같은 메서드들이 Delegate 내에 들어있는 겁니다
// - TableView
// 어떤 행이 선택되었을 때
func tableView(UITableView, didSelectRowAt: IndexPath)
// 어떤 행이 선택해제 되었을 때
func tableView(UITableView, didDeselectRowAt: IndexPath)
// - TextField
// 키보드의 Return키를 눌렀을 때
func textFieldShouldReturn(_ textField: UITextField) -> Bool
// 텍스트필드에 입력이 시작되었을 때
func textFieldDidBeginEditing(_ textField: UITextField)
// 텍스트필드에서 입력이 끝났을 때
func textFieldDidEndEditing(_ textField: UITextField)
❓ DataSource
이번에는 DataSource에 대해서 알아보겠습니다!
DataSource는 앞서 말했던 것처럼 TableView, CollectionView, PickerView 등이 가지고 있고 이 세 요소들 모두 공통점을 가지고 있습니다
어떤 공통점이 있는지 금방 찾으셨겠죠?
바로, 사용자에게 어떠한 데이터를 나열해서 보여주는 것들이라는 점입니다
이처럼 DataSource는 데이터를 받아와 이 데이터를 사용자에게 어떻게 보여줄지에 대해 정의하는 역할을 합니다
그래서 우리가 TableView를 그릴 때, 흔히 사용하는 셀을 구성하는 메서드(cellForRowAt)이라든가 섹션 내에 그려줘야 할 행의 개수(numberOfRowsInSection)를 정의해 주는 메서드 등이 TableView의 DataSource 프로토콜에 포함되어 있는 겁니다!
이외에도 각 요소마다 다양한 메서드들이 DataSource에 포함되어 있습니다
// - TableView
// 섹션 내에 행이 몇 개인지
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
// 셀을 어떻게 구성할 지
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
// - CollectionView
// 섹션 내 아이템의 개수
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
// 셀을 어떻게 구성할 지
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
// - PickerView
// 컴포넌트 내에 몇 개의 행을 넣을지
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
✏️ 오늘의 요약
- Delegate
- 사용자의 액션에 관한 것을 정의할 때 채택하는 프로토콜
- DataSource
- 데이터를 어떤 형태로 보여줄지 정의할 때 채택하는 프로토콜
📚 참고
https://zeddios.tistory.com/137
[iOS / Swift] Swift 문법을 알아보자! - 21편 : Delegate와 Datasource