- Total
꿈꾸는리버리
delegate란? (protocol을 곁들인..) (1/2) 본문
UIKit을 공부하기 시작하면 delegate~~ delegate ~~~ 이..
위임자.. 대리자... 뭐 그런 녀석들의 이름을 많이 듣는다.
블로그들을 보고 공식 문서를 봐도... 잘 이해가 되지 않고,.. 그래서 많이 애먹었던 !
요 delegate 녀석을 다뤄보고자 한다 !
어디서나 볼 수 있듯이 핵심은 delegate(대리자)는 "남의 일을 대신해야 하는.. 녀석" 이다..
이렇게 말하면 이해가 잘 되지 않는다. ( 나는.. 그랬씁니다.. )
🌷 예제를 통해 차근차근 알아가보자 !
class A {
func work() {
print("A가 일을 합니다")
}
}
A는 work()라는 함수를 가지고 있는.. A 일을 하는 녀석이다.
class B {
weak var delegate: A?
func work() {
print("B가 일함")
}
// A 일 시키기
func letsMakeAWork() {
delegate?.work()
}
}
B는 A를 delegate로 데리고 와서 A 일을 시킨다.
B가 하는 일은 따로 있고 A가 하는 일도 따로 있다. work()를 실행하면 B가 일하고, letsMakeAWork()를 실행하면 A가 일한다.
다시 말해서 B가 해야 하는 모든 일 중 일부만을 수행하고 일부는 A보고 하라고 시킨다 !
delegate(A)는 어떤 객체(B)가 해야 하는 일을 부분적으로 대신 처리한다.
한번 확인해보자 !
let b = B()
let a = A()
b.delegate = a
이렇게 와 b에 인스턴스를 할당해주고, b의 delegate로 a를 데리고 온다.
b.letsMakeAWork()
// "A가 일을 합니다"가 출력됨
그리고 b가 a에게 일을 시킨다.
전체 코드
전체 코드를 보면서 차근차근 다시 이해해보자 !
class A {
func work() {
print("A가 일을 합니다")
}
}
class B {
weak var delegate: A?
func work() {
print("B가 일함")
}
func letsMakeAWork() {
delegate?.work()
}
}
let b = B()
let a = A()
b.delegate = a
b.letsMakeAWork()
사실... 핵심은 이게 끝이다 !!
이렇게 B는 하는 일의 일부를 A에게 시킨다. 그리고 이때는 A의 work()라는 함수를 실행할 뿐 그 work() 함수 안에서는 어떤 일이 일어나는 지는 모른다.
하지만,, 이게 끝이 아니다 ㅎㅎ
🌷 이제 여기서 protocol을 곁..들인다..
Workable이라는 protocol이 있다. 이 protocol를 채택하려면 work()라는 함수가 꼭 있어야 하고, class만이 Workable을 채택할 수 있다. (만약 이 내용이 이해가 안된다면 해당 프로토콜 포스터를 읽어보는 걸 권장한다.)
protocol Workable: AnyObject {
func work()
}
일을 하는 A는 Workable을 채택했기 때문에 work() 함수를 구현해야만 한다.
class A: Workable {
func work() {
print("A가 일을 합니다")
}
}
B의 delegate가 이전 예시와 달리 A가 아닌 Workable 타입을 가진다.
+) Workable 프로토콜에는 work라는 함수가 반드시 있어야 하기 때문에 delegate는 work() 함수를 실행할 수 있다.
class B {
weak var delegate: Workable?
func letsMakeAWork() {
delegate?.work()
}
}
다음과 같이 작성하면 이전과 같은 결과를 가진다 !
let b = B()
let a = A()
b.delegate = a
b.letsMakeAWork()
Okay,, 이건 이해를 했어..! 근데 왜 굳이 protocol을 쓰는 거죠 ?
호잇차 !
이렇게 class C에도 일을 맡길 수 있다 !
protocol에서 요구하는 함수는 class에서 구현이 되기 때문에 더 다양하고 다채로운 ? work()함수가 구현될 수 있다. ( 이것은 프로토콜의 장점 !! )
protocol Workable: AnyObject {
func work()
}
class A: Workable {
func work() {
print("A가 일을 합니다")
}
}
class C: Workable {
func work() {
print("C가 일을 합니다")
}
}
class B {
weak var delegate: Workable?
func letsMakeAWork() {
delegate?.work()
}
}
let b = B()
let a = A()
b.delegate = a
b.letsMakeAWork()
let c = C()
b.delegate = c
b.letsMakeAWork()
이제 조금 이해가 되는 가..?? ㅎㅎ
다음 포스팅에서는 실제 UIKit 에서 어떻게 쓰이는 지 예시를 통해 알아보도록 하겠다 !
'오뚝이 개발자 > swift' 카테고리의 다른 글
FileManager로 파일 읽고 쓰기 + 폴더 만들기 (0) | 2022.08.26 |
---|---|
DateFormatter extension으로 관리하기 (0) | 2022.07.25 |
protocol 정복기 ( 3 / 3) (0) | 2022.07.24 |
protocol 정복기 ( 2/ 3) (0) | 2022.07.24 |
protocol 정복기 ( 1 / 3) (0) | 2022.07.24 |