본문 바로가기
iOS_Swift/문법 정리

Swift - protocol(프로토콜), Delegate

by chozjjae 2022. 5. 9.

Delegate - 대표자(명사)또는 위임하다(동사).

Delegation(위임)

  • 클래스나 구조체가 일부 책임을 다른 유형의 인스턴스로 전달 또는 위임 할 수 있도록 하는 디자인 패턴이다.
  • 위임된 기능은 프로토콜에서 정의하며, delegate가 위임된 기능을 제공한다.
  • 위임은 특정 작업에 응답하거나 외부에서 데이터를 가져오는데 사용할 수 있다.
  • delegate로 선언된 객체1은 자신을 임명한 객체2가 일을 도와달라고 하면 지정된 메서드를 통하여 처리해준다. 
    • 객체1 - 보통 내가 만든 클래스를 의미한다.
    • 객체2 - 테이블뷰, 피커뷰 등
  • 보통 protocol을 사용한다.

Delegate 패턴

  • 하나의 객체가 모든 일을 처리하는 것이 아니라 처리해야 할 일 중 일부를 다른 객체에 넘기는 것을 의미한다.

Protocol(프로토콜)

  • 특정 클래스와 관련없는 함수(메서드)들의 선언 집합을 의미한다.
    • *함수(메서드)에 대한 정의는 없으며, 기능이나 속성에 대한 설계도로 생각하자
  • protocol은 상속 받는다가 아닌 채택 한다고 표현한다.
  • POP - Protocol Oriented Programming
    • 프로토콜 단위로 묶어 표현하고, extension으로 기본적인 것을 구현해서 단일 상속의 한계를 극복할 수 있다.

사용 방법

  • protocol 프로토콜명{ 메서드 선언 } //메서드는 선언만 있다.
  • protocol 프로토콜명 : 부모1 프로토콜, 부모2 프로토콜 //프로토콜은 다중 상속도 가능하다.
  • class 클래스명:부모명, 프로토콜명1,프로토콜명2 { }
  • class 클래스명:프로토콜명{ }
    • 부모가 없다면 바로 protocol을 표기 가능하다.

클래스, 구조체, 열거형, extension에 프로토콜을 채택(adopt) 할 수 있다.


 

protocol과 프로퍼티/메서드 선언

protocol choProtocol{
    var x : Int {get set} //읽기와 쓰기 모두 가능
    var y : Int {get} //읽기만 가능
    static var tx : Int {get set}
    static func typeMethod()
    func random() -> Double
}

protocol 정의, 채택, 준수 예시

protocol Runnable{ //대리하고 싶은 함수 목록 작성
    var x : Int {get set} //읽기와 쓰기가 가능한 프로퍼티
    func run() //메서드는 선언만 한다.
}

class Man : Runnable{ //protocol채택
    var x : Int = 1 //프로퍼티 준수
    func run(){ //함수 준수
        print("\(x),사람")
    }
}
var cho = Man()
print(cho.x) //1
cho.run() //1, 사람

 

주로 ViewController클래스는 부모 UIViewCOntroller를 상속 받고, UIPickerVIew형의 인스턴스 pickerImage를 선언하고 피커뷰 인스턴스를 사용하기 위해 프로토콜 UIPickerViewDelegate와 UIPickerViewDataSource를 채택한다.

*class ViewController : UIViewCOntroller, UIPickerViewDelegate, UIPickerViewDataSource{ }

class ViewController : UIViewCOntroller, UIPickerViewDelegate, 
UIPickerViewDataSource{ @IBOutlet var picker Image : UIPickerView!...

프로토콜 UIPickerViewDelegate와 UIPickerViewDataSource의 필수 메서드는 모두 구현해야 프로토콜을 준수한다(conform).

 


인덕대학교 한성현 교수님의 강의를 참고하였습니다.