iOS/Swift
[Swift] Protocol 프로토콜 [1]
최지철
2023. 9. 1. 16:27
반응형
프로토콜 Protocol 이란?
- 특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항등의 청사진
프로토콜의 사용
- 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현 할 수 있다.
- 프로톨클은 기능을 정의하고 제시 할 뿐, 스스로 기능을 구현하는 것은 아니다 (조건만 정의)
- 스위프트에서 프로토콜은 하나의 타입으로 사용된다.
- 파라미터나 리턴타입으로 사용
- 프로퍼티, 변수, 상수의 타입으로 사용
- 배열 등 컨테이너 요소의 타입으로 사용
프로토콜의 형태
protocol Student{
var name: String {get}
var grade: Int {get set}
static var Number: Int {get set}
}
프로토콜의 요구사항
- 프로퍼티와 타입 프로퍼티의 요구가능
- 프로퍼티 요구사항은 항상 var로 선언
- 프로퍼티를 읽기 전용 {get}, 읽고 쓰기 {get, set}로 할지 정해줘야 함
- 타입 프로퍼티는 static 키워드를 사용해 선언
protocol example {
mutating func examplefunc()
func send(data: Any)
static func sendInstantce(_ instance: Any) -> Bool
}
메소드 요구사항
- 인스턴스 메소드 또는 타입 메소드 요구 가능
- 메소드에서 함수 body를 제외하고 헤드부분만 작성
- 타입 메소드는 static 키워드 사용
가변 메소드 요구
- 값 타입의 인스턴스 메소드에서 자신 내부의 값을 변겨할 때 func앞에 mutating으로 선언한다
- 가변 메소드를 요구한 프로토콜을 클래스가 구현할 때는 mutating 키워드 생략
- 프로토콜에서 가변 메소드를 요구하지 않으면, mutating 메소드 구현 불가
protocol Name {
var name: String { get }
init(name: String)
}
class Person: Named {
var name: String
required init(name: String) {
self.name = name
}
}
이니셜 라이저 요구
- 프로토콜에서는 이니셜라이저 정의 가능
- 실패가능한 이니셜라이저도 선언 가능
- 프로토콜이 요구한 이니셜라이져가 구현된 클래스를 상속받는 클래스에서는 required override를 모두 명시해야함
- final 키워드를 사용한 class의 경우 상속이 되지 않기 때문에 상속 고려X -> required 필요 X
- 프로토콜에서 특정 이니셜라이저가 필요하다고 명시하면 구현할 때, 이니셜라이저에 required 키워드를 붙여줘야함
프로토콜 채택
- 구조체, 클래스, 열거형 등에서 채택가능
- 클래스 상속도 함께 받는 경우도 가능
protocol Readable {
func read()
}
protocol Writeable {
func write()
}
protocol ReadWriteSpeakable: Readable, Writeable {
func speak()
}
프로토콜의 상속
- 프로토콜 끼리도 상속가능
- 구현시, 상속받은 프로토콜의 요구사항 까지 모두 구현가능
클래스 전용 프로토콜 (Any Object)
- 프로토콜의 상속 리스트에 Class 키워드를 추가하면, 프로토콜이 클래스 타입에만 채택할 수 있도록 제한 가능
위임을 위한 프로토콜( Delegation)
- 클래스나 구조체가 자신의 책임을 다른 인스턴스에게 위임하는 디자인패턴
- Dleegaiton된 기능을 제공할 수 있도록 책임을 캡슐화하는 프로토콜을 정의하는것으로 구현
- 특정 액션에 응답 또는 해당 소스의 기본 타입을 알 필요 없이 외부 소스에서 데이터를 검색하는데 사용할 수 있다.
- EX) 테이블뷰, 컬렉션뷰 델레게이트가 있다.
반응형