아리의 iOS 탐구생활

[iOS] Delegation 패턴에 대해서 알아보자. 본문

Swift/iOS

[iOS] Delegation 패턴에 대해서 알아보자.

Ari Lee 2021. 12. 2. 18:03
반응형

Delegation을 한줄로 요약하자면 아래와 같다.

어떤 상황이 발생했을 때 어떤 객체에게 응답을 준다. 약간 리모콘을 발동시킨다는 느낌...?

 

 

Delegate는 보통 Protocol을 정의하여 사용된다. Protocol이란 일종의 기능 명세서 같은 것으로 Delegate로 지정된 객체가 해야하는 메소드들의 원형을 적어놓는다. Delegate 역할을 하려는 객체는 이 Protocol을 따르며 원형만 있던 메소드들의 구현을 한다. 이렇게 세팅 후 이전 객체는 어떤 이벤트가 일어났을 시 Delegate로 지정한 객체에 알려줄 수 있다.

 

 

 

# 장점

  • 매우 엄격한 Syntax로 인해 프로토콜에 필요한 메서드들이 명확하게 명시된다.
  • 컴파일 시 경고나 에러가 떠서 프로토콜의 구현되지 않은 메소드들을 알려준다
  • 로직의 흐름을 따라가기 쉽다
  • 프로토콜 메소드로 알려주는 것 뿐만 아니라 정보를 받을 수 있다.
  • 커뮤니케이션 과정을 유지하고 모니터링하는 제 3의 객체가 필요없다. (NotificationCenter같은 외부 객체)
  • 프로토콜이 컨트롤러의 범위 안에서 정의된다.

 

 

 

# 단점

  • 많은 줄의 코드가 필요하다
  • delegate 설정에 nil이 들어가지 않게 주의해야한다. 크래시를 일으킬 수 있다.
  • 많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적이다. (가능은 하다.)

 


  

# 선언부 (처리하라고 시키는 객체, 주로 이벤트를 받는 뷰들)

  • 리모콘호출 응답을 받아서 일을 처리할 클래스에 프로토콜 타입 프로퍼티를 옵셔널로 선언한다.
  • 리모콘작동 어느 시점에서 실행할지 정했던 부분에 프로토콜의 메서드를 호출해주면 된다.

 

# 구현부 (대신 처리해줄 객체 , ViewController)

  • 프로토콜을 생성한다.
  • 리모콘설계 첫번째 뷰에 delegate를 채택하고 프로토콜을 준수한다 (메서드 구현 등…)
  • 리모콘전달 프로토콜을 채택하고 준수한 첫번째 뷰에서 리모콘을 실행할 다음 뷰로 넘어갈때 자신을 넘겨준다
    (예시: nextView.delegate = self)

 

 

# 언제 사용할까?

  • 하나의 객체가 해야하는일이 여러가지일 때
  • 수신받는 객체가 많을 때, 콜백 블럭을 받기 위한 목적이 분명할 때
  • 내부의 블록을 호출시키는 코드를 읽고 다시 돌아와서 추적할 일이 없는 경우

 

 

간단한 예제코드를 통해 Delegation 패턴을 이해해보자.

protocol BossDelegate {
    func wakeUp() // 깨우는 일을 위임
}

class Boss: BossDelegate {
    private var isSleeping: Bool = true
    
    func wakeUp() { // 비서가 해줄일
        isSleeping = false
        print("보스: 아...잘잤다~~~~")
    }
}

class Secretary {
    var boss: BossDelegate? // 보스를 위임받음
    
    func wakeUpBoss() { // 비서가 하는일
        print("비서: 사장님... 일어나셔야죠...!!!")
        boss?.wakeUp() // 보스의 일을 대신해줌, Delegation 패턴 적용
    }
}
let secretary = Secretary()
let ari = Boss()
secretary.boss = ari // 보스를 설정후
secretary.wakeUpBoss() // 보스를 깨운다.

/*
비서: 사장님... 일어나셔야죠...!!!
보스: 아...잘잤다~~~~
*/
반응형

'Swift > iOS' 카테고리의 다른 글

[UIKit/iOS] 뷰의 재사용이란?  (0) 2022.02.06
[iOS/UIKit] Frame vs Bounds  (0) 2021.12.02
[iOS/UIKit] init(frame:)와 init(coder:)  (0) 2021.12.01
[iOS/Swift] TDD와 Unit Test  (0) 2021.11.23
[iOS/UIKit] prepare method 알아보기  (0) 2021.10.28
Comments