관리 메뉴

사과하는 제라스

[Swift 디자인패턴] delegate 패턴을 알아보자 본문

제라스의 iOS 공부/Swift 디자인 패턴

[Swift 디자인패턴] delegate 패턴을 알아보자

Xerath(제라스) 2023. 9. 17. 19:21

목차

    728x90
    반응형

    delegate...

    delegate는 위임자라는 뜻이다. 어떤 것에 대한 대리자, 즉, 수행할 사람이란 거다. 밑에 코드를 한번 보자.

     

    import UIKit
    
    // 대리자에 대한 프로토콜
    protocol RemoteControlDelegate {
        func channelUp()
        func channelDown()
    }
    
    
    // 리모콘 클래스(유저와 직접 대면함)
    class RemoteControl {
        
        var delegate: RemoteControlDelegate? //사실상 여기에는 내가 이 리모콘으로 무엇을 작동할지 적는 것임.
        
        func doSomething() {
            print("리모콘의 조작이 일어나고 있음")
        }
        
        func channelUp() {   // 어떤 기기가 리모콘에 의해 작동되는지 몰라도 됨
            delegate?.channelUp()
        }
        
        func channelDown() {   // 어떤 기기가 리모콘에 의해 작동되는지 몰라도 됨
            delegate?.channelDown()
        }
    }
    
    
    // TV 클래스(리모콘과 커뮤니케이션하여 동작을 함.)
    class TV: RemoteControlDelegate {
        
        func channelUp() {
            print("TV의 채널이 올라간다.")
        }
    
        func channelDown() {
            print("TV의 채널이 내려간다.")
        }
    
    }
    
    let remote = RemoteControl()
    let samsungTV = TV()
    
    remote.delegate = samsungTV
    
    
    
    remote.channelUp()        // 리모콘 실행 ====> delegate?.channelUp()
    remote.channelDown()      // 리모콘 실행 ====> delegate?.channelDown()
    
    
    
    
    
    // SmartPhone 클래스(리모콘과 커뮤니케이션하여 동작을 함.)
    class SmartPhone: RemoteControlDelegate {
    
        init(remote: RemoteControl) {
            remote.delegate = self       // remote.delegate = smartPhone
        }
        
        func channelUp() {
            print("스마트폰의 채널이 올라간다.")
        }
        
        func channelDown() {
            print("스마트폰의 채널이 내려간다.")
        }
    }
    
    let smartPhone = SmartPhone(remote: remote)
    remote.channelUp()        // 리모콘 실행 ====> delegate?.channelUp()
    remote.channelDown()      // 리모콘 실행 ====> delegate?.channelDown()

    지금 클래스는 3개가 있다. RemoteControl, TV, SmartPhone.

    이들의 관계는 이름부터 명시적이다. RemoteControl로 TV나 SmartPhone에 대한 동작을 제어하는 것이다. 즉 우리는 어떤 RemoteControl에 delegate(대표될 것)를 TV나 SmartPhone으로 지정해두면 그 RemoteControl 객체는 delegate에 지정된 것에 대한 것으로 적용이 되고 우리는 RemoteControl을 이용해서만 동작을 하면 되기에 RemoteControlDelegate 프로토콜을 채택한 하나의 객체만 지정해주면 된다.

     

    일단은 이렇게 대충 간단한 예시만 공부를 했는데 아마 좀 더 알아가야 할 요소들이 있지 않을까 싶다. 그래도 이런 형태의 패턴이구나 하고 이해할 수 있어서 다행이다.

    728x90
    반응형