MVVM을 공부하던 중 데이터 바인딩이 필요하다는 것과 함께 Delegation도 그 방법 중 하나라는 것을 알게 됐다. 그동안 TableView를 사용하면서 Delegate를 정확한 이해없이 사용했기 때문에 나중에 참고하기 위해 공부한 내용을 정리해보고자 한다.
프로토콜과 델리게이트는 iOS 개발에서 정말 자주 사용되는 디자인 패턴이다. TableView, CollectionView를 써봤다면 tableView.delegate = self 같은 코드를 작성해봤을 것이다.
Protocol은 객체 간의 상호작용을 정의하기 위한 인터페이스이다. 자바의 interface와 비슷하다고 생각해도 될 것 같다. Protocol에는 메소드, 프로퍼티와 같은 요구사항을 명시하여 이 Protocol을 채택하는 클래스 혹은 구조체가 이것들을 구현하도록 강제성을 부여한다. 즉, Protocol는 구현하는 것이 아닌, 요구사항 명시만 하는 것이다.
Protocol을 사용하면 다형성(polymorphism)을 구현하고, 코드의 재사용성과 유연성을 높일 수 있다.
프로토콜의 기본적인 정의 방식은 다음과 같다.
protocol SomeProtocol {
// 메소드 선언
func someMethod()
// 프로퍼티 선언
var someProperty: Int { get set }
}
Delegate의 사전적 의미로 대표, 위임하다, 뽑다 가 있다. 이때 여기서 위임하다 라는 뜻에 집중해보자. Delegate는 어떤 Protocol을 채택하고, 그 기능들을 위임받아서 구현한다.
이렇게 Delegate에 필요한 기능을 구현한다면, 그 기능을 다른 곳에서도 사용할 수 있게 된다.
내가 이해한대로라면 전체적인 흐름은
Protocol로 필요한 기능, 프로퍼티 선언 -> Protocol에 선언된 기능이 필요한 클래스에 해당 프로토콜 타입의 변수로 delegate를 선언, 그 클래스에서는 delegate를 통해 메소드 호출하여 사용 -> 해당 Protocol을 선언하는 클래스에는 delegate를 사용하는 객체.delegate = self 로 자신이 위임함을 명시하고, 기능 구현
이 되는 것..같다. 이렇게 쓰니 좀 헷갈리고 이상하네.. 그치만 어느정도 이해는 된 것 같다.
아래 블로그 글을 쓰신 분이 정말 잘 정리해주셔서 첨부해놓아야겠다. (그래야 나도 나중에 봄ㅎ)
https://welcometodannas.tistory.com/72