반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

delegate란? (protocol을 곁들인..) (1/2) 본문

오뚝이 개발자/swift

delegate란? (protocol을 곁들인..) (1/2)

rriver2 2022. 7. 24. 18:00
반응형

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 에서 어떻게 쓰이는 지 예시를 통해 알아보도록 하겠다 !

반응형
Comments