Dev/Swift

Swift: Protocol과 Delegate

두넌 2023. 5. 15.

DAY 18

Protocol과 Delegate

 

Delegation


Delegation(위임) 은 클래스나 구조체가 일부 책임을 다른 유형의 인스턴스로 전달(또는 위임)할 수 있도록 하는 디자인 패턴

위임된 기능은 프로토콜에서 정의하며, delegate가 위임된 기능을 제공

 

delegate

  • 대리자, 조력자
  • 델리게이트로 선언된 객체는 자신을 임명한 객체의 요청으로 지정된 메서드를 통하여 처리해 줌
  • 델리게이트 패턴
    • 하나의 객체가 모든 일을 처리하는 것이 아니라, 처리해야 할 일중 일부를 다른 객체에 넘기는 것
  • 보통 프로토콜을 사용

 

프로토콜(protocol)


특정 클래스와 관련없는 property, method 선언 집합

함수(method) 정의는 없음

기능이나 속성에 대한 설계도

클래스(구조체, 열거형)에서 채택(adopt)하여 메서드를 구현해야 한다

 

  • JAVA, C#의 interface
  • C++의 abstract base class
  • Protocol Oriented Programming(POP)
    • 프로토콜 단위로 묶어 표현하고, extension으로 기본적인 것을 구현하여 단일 상속의 한계를 극복

 

Protocol 채택

class 클래스명: 부모명, 프로토콜명1, 프로토콜명2 {}

class 클래스명: 프로토콜명1, 프로토콜명2{}

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {}

부모 클래스가 있으면 부모 다음에 표기하며, 부모 클래스가 없으면 바로 표기 가능

 

Protocol 정의

protocol 프로토콜명 {
    // property 명
    // method 선언 (method는 선언만 있음)
}

protocol 프로토콜명: 다른프로토콜1, 다른프로토콜2 {
    // protocol은 다중 상속도 가능
}

protocol SomeProtocol {
    var x: Int { get set }  // 읽기와 쓰기가 가능
    var y: Int { get }      // 읽기 전용
    static var tx: Int { get set }
    static func typeMethod()    // method 선언
    func random() -> Double
}

 

Protocol 채택, 준수

protocol Runnable {
    var x: Int { get set }
    func run()
}
class Man: Runnable {           // 채택(adopt)
    var x: Int = 1              // 준수(conform)
    func run() {print("run")}   // 준수(conform)
}

 

프로토콜 채택(adopt)하고 위임


ViewController클래스는 부모 UIViewController를 상속받고, UIPickerView형의 인스턴스 pickerImage를 선언

class ViewController: UIViewController {
    @IBOutlet var pickerImage: UIPickerView!

PickerView instance를 사용하기 위해 프로토콜 UIPickerViewDelegateUIPickerViewDataSource를 채택

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

프로토콜 UIPickerViewDelegateUIPickerViewDataSource의 필수 메서드는 모두 구현해야 프로토콜을 준수(conform)

  • ~~Delegate는 어떤 행동에 대한 반응 동작 메서드
  • ~~DataSource에는 데이터를 받아 뷰를 그려주는 메서드

 

UIPickerViewDelegate

스크린샷 2022-02-05 시간: 20 12 25

optional 키워드가 붙은 것을 알 수 있는데, 이는 앞서 배웠던 옵셔널과는 다르고, 클래스 내에 이 메서드가 필요하다면 구현하라는 선택적인 의미가 담겨 있음

 

UIPickerViewDataSource

스크린샷 2022-02-05 시간: 20 12 46

아래 Required라는 단어가 붙은 것을 알 수 있는데, 이는 클래스 내부에 이 메서드는 반드시 구현해야 된다는 의미가 담겨 있음

 

 

추가


중간에 @IBOutlet키워드를 볼 수 있었는데, 이는 코드에 정의된 변수와 화면의 객체(Storyboard)를 연결하는 것

@IBAction은 Event가 일어난 경우 호출되는 Action을 정의해둔 것

변수나 함수를 정의할 때 두 키워드를 작성하여 storyboard에서의 컴포넌트와 연결이 가능함

댓글