사전적 의미 Delegate : 대리인

객체와 객체간의 커뮤니케이션을 돕는다.

프로토콜 타입을 사용하여 요구사항을 구현하여 전달

왜 프로토콜을 사용하는가? 애플이 개발자가 어떤이름을 사용할지 모르기때문이다. 프로토콜 자체가 타입으로 인식해서 어떤 이름을 사용해도 상관이없어져있기때문

<aside> 💡 각종 이벤트를 효율적으로 관리하기 위해 대리자를 지정하여 이벤트 처리를 위임하고,

이벤트 발생시 위임된 대리자가 콜백 메소드를 호출하는 설계 패턴

예시로 살펴보자

리모콘을 만든 후 리모콘 델리게이트로 tv를 사용해보기

RemoteControlDelegate이라는 프로토콜에 채널을 올리고, 내릴수 있도록 위임(대리)해준다.

protocol RemoteControlDelegate {
    func channelUp()
    func channelDown()
}

TV의 채널을 올리고 내리는 요구사항을 작성해준다.(실제 동작을 함)

class RemoteControl {
    
    var delegate: RemoteControlDelegate?  //프로토콜타입으로 정의
    
    func doSomething() {
        print("리모콘의 조작이 일어나고 있음")
    }
    
    func channelUp() {   // 어떤 기기가 리모콘에 의해 작동되는지 몰라도 됨
        delegate?.channelUp()    //대리자의 channelUp이라는 메소드호출
    }
    
    func channelDown() {   // 어떤 기기가 리모콘에 의해 작동되는지 몰라도 됨
        delegate?.channelDown()
    }
}

RemoteControlDelegate 프로토콜을 채택하여 리모콘이라는 객체를 만들어준다.

채택한 곳에서 Delegate를 통해서(대리자의) channelUp,channelDown이 동작된다.

// TV 클래스(뷰컨트롤러의 역할 - 리모콘과 커뮤니케이션)
class TV: RemoteControlDelegate {
    
    //필수적인 요구사항을 구현해야함
    func channelUp() {
        print("TV의 채널이 올라간다.")
    }

    func channelDown() {
        print("TV의 채널이 내려간다.")
    }

}

let remote = RemoteControl()
let samsungTV = TV()

remote.delegate = samsungTV    //대리자가 samsungTV

객체내에서 사용시 self로 사용할수 있음