본문 바로가기
iOS/Swift

[iOS] Protocol과 Delegate

by 안녕주 2021. 10. 31.

프로토콜

  • 특정 기능 및 역할을 수행하기 위해 필요한 것들이 적혀있는 설명서와 동일한 개념
  • 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등이 적혀있는 하나의 "설명서" 다.

 

프로토콜 채택이란

  • "이 설명서를 드릴테니, 여기 나와있는대로 구현해주세요" 라고 다른 타입(구조체,클래스,열거형)에게 전달하는 것이 가능하며, 이 행위를 프로토콜 채택이라고 한다.
  • 프로토콜은 protocol이라는 키워드를 사용해 내부 블럭 안에 필요한 부분들을 정의한다. (프로퍼티, 메서드, 이니셜라이저 등 필요한 요구사항을 적는다)
protocol Talkabl {

	//프로퍼티 요구
	var topic : String { get set }
	var language : String { get }

	//메서드 요구
	func talk()

	//이니셜라이저 요구
	init(topic: String, language: String)
}

 

  • 프로토콜에서는 해야할 일을 정의만 하고,  구현은 프로토콜을 채택한 객체에서 이루어진다.
  • 프로퍼티를 요구할 때는 반드시 var를 작성해야하며, get/set이 가능한지 명시해야한다.

 

프로토콜 채택 작성하는법

  • (타입 이름) (타입) : (프로토콜) { 정의하는 부분 }
struct Person : Talkable 
{
	//정의
}
  • 해당 타입에 특정 프로토콜을 채택하게 되면 "반드시" 해당 프로토콜에 적힌 요구사항들을 구현해야한다. (프로토콜에 있는 부분은 모두 구현해야한다.)
  • 프로토콜 채택은 동시에 여러개 가능
protocol Readable {
	func read()
}
protocol Writeable {
	func write()
}
protocol ReadSpeakable: Readable {
	func speak()
}
protocol ReadWriteSpeakable: Readable, Writeable {
	func speak()
}
  • 클래스에서 상속과 채택을 동시에 하려면 상속받으려는 클래스를 먼저 적고, 그 이후에 채택하려는 프로토콜 작성하면 된다.
class SuperClass: Readable {
	func read() {}
}

class SubClass: SuperClass, Writeable, ReadSpeakable {
	func write() {}
	func speak() {}
}

Delegate Pattern

Delegate의 뜻은 "위임하다: 어떤 일을 책임 지워 맡기다", 할 일을 분배해서 다른사람에게 해당 일에 "위임" 시킨 후 해당 일이 들어오면 그 일을 맡은 사람이 한다는것!

 

[예를 들어

커피, 에이드, 티 3종류만 파는 카페가 있습니다.

사장은 혼자서 커피, 에이드, 티를 다 만들 수 있지만,

그것보다는 각각 종류를 담당할 다른 직원를 구해서

해당 메뉴 주문이 들어오면 그 담당 직원에게 맡기는 것이 더 효율적일겁니다.

그래서, 종류 별 일할 직원을 구해야하는데 아무나 오면 안될겁니다.

"현재 해당 종류를 만들 수 있는 사람" 이라는 조건을 걸어 사람을 구해야합니다.

여기서 "현재 해당 종류를 만들 수 있는 사람" 이라는 조건을 Protocol이라고 합니다. ]

 

  • Delegate Pattern은 쉽게 말해 객체지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라, 처리 해야 하는 일 중 일부를 다른 객체에 넘기는 것이다.
  • 주로 프레임워크 객체가 위임을 요청하며, 커스텀 컨트롤러 객체가 위임을 받아 특정 이벤트에 대한 기능을 구현한다.
  • 커스턴 컨트롤러에서 세부 동작을 구현함으로써 동일한 동작에 대해 다양한 대응을 할 수 있게 해준다.
  • Foundation, UIKit 그리고 Cocoa Touch 등 애플의 프레임워크에서 광범위 하게 활용된다.

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

[iOS] WirdCard Pattern, 와일드카드 패턴  (1) 2021.11.14
[iOS]클로저 Closure  (0) 2021.11.07
[iOS] Struct와 Class  (0) 2021.10.23
[iOS] @IBOutlet과 @IBAction  (0) 2021.10.16
[iOS] Life Cycle  (0) 2021.10.16

댓글