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를 사용하기 위해 프로토콜 UIPickerViewDelegate
와 UIPickerViewDataSource
를 채택
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
프로토콜 UIPickerViewDelegate
와 UIPickerViewDataSource
의 필수 메서드는 모두 구현해야 프로토콜을 준수(conform)
~~Delegate
는 어떤 행동에 대한 반응 동작 메서드~~DataSource
에는 데이터를 받아 뷰를 그려주는 메서드
UIPickerViewDelegate
optional
키워드가 붙은 것을 알 수 있는데, 이는 앞서 배웠던 옵셔널과는 다르고, 클래스 내에 이 메서드가 필요하다면 구현하라는 선택적인 의미가 담겨 있음
UIPickerViewDataSource
아래 Required
라는 단어가 붙은 것을 알 수 있는데, 이는 클래스 내부에 이 메서드는 반드시 구현해야 된다는 의미가 담겨 있음
추가
중간에 @IBOutlet
키워드를 볼 수 있었는데, 이는 코드에 정의된 변수와 화면의 객체(Storyboard)를 연결하는 것
@IBAction
은 Event가 일어난 경우 호출되는 Action을 정의해둔 것
변수나 함수를 정의할 때 두 키워드를 작성하여 storyboard에서의 컴포넌트와 연결이 가능함
댓글