프로토콜 (Protocol)
- 특정 작업이나 기능에 적합한 메서드, 프로퍼티 및 기타 요구사항의 ‘약속’을 정의
- 클래스(class), 구조체(struct), 열거형(enum)에서는 어떠한 프로토콜을 채택하여 해당 프로토콜의 요구사항을 실제로 구현 가능
- 프로토콜의 요구사항을 충족시키는 모든 타입은 해당 프로토콜을 준수한다 혹은 따른다고 함
- 프로토콜을 채용한 형식은 요구사항을 반드시 모두 구현해야 함
- 프로토콜은 프로토콜 간 상속을 지원하며, 클래스와 달리 다중 상속도 지원
프로토콜 채택하기
- 클래스, 구조체, 열거형에서 정의한 프로토콜을 채택하기 위해서는 콜론(:)을 사용
- 하나의 타입에서 다수의 프로토콜을 채택하기 위해서는 콤마(,)를 사용
- 클래스에서 상속과 프로토콜 채택을 동시에 하려면 상속받으려는 클래스를 먼저 명시한 뒤, 채택할 프로토콜 목록을 작성
protocol SomeProtocol {}
// 프로토콜 채택
struct SomeStructure: SomeProtocl {}
// 다수의 프로토콜 채택
struct SomeStructure: SomeProtocol, AnotherProtocol {}
// SomeSuperClass를 상속 받고 있고, SomeProtocl을 채택한 클래스 정의
class SomeClass: SomeSuperClass, SomeProtoc {}
프로토콜 프로퍼티
- 프로퍼티는 타입과 이름만 작성
- gettable/settable 여부를 작성
- 프로퍼티는 var로 선언
프로토콜 메서드
- 메서드 작성 가능
- 일반적인 메서드 와는 달리 본문은 작성하지 않음
protocol SomeProtocol {
var a: Int { get }
var b: Int { get set }
func setNumber(a: Int, b: Int)
func add() -> Int
}
class SomeClass: SomeProtocol {
var a: Int = 0
var b: Int = 0
func setNumber(a: Int, b: Int) {
self.a = a
self.b = b
}
func add() -> Int {
return a + b
}
}
프로토콜 이니셜라이저
- 프로토콜에서는 필수로 구현해야 하는 이니셜라이저를 지정 가능
- 이니셜라이저가 있는 프로토콜을 채택한 타입에서는 해당 이니셜라이저에 required 키워드를 작성해야 함
protocol SomeProtocol {
init(someParameter: Int)
}
class SomeClass: SomeProtocol {
required init(someParameter: Int) {
}
}
프로토콜 상속
- 프로토콜은 하나 이상의 프로토콜을 상속받아 기존 프로토콜의 요구사항보다 더 많은 요구사항을 추가할 수 있음
- 프로토콜 상속 문법은 클래스의 상속 문법과 유사하지만, 프로토콜은 클래스와 다르게 다중상속이 가능
클래스 전용 프로토콜
- 구조체, 열거형에서 사용하지 않고 클래스 타입에만 사용가능한 프로토콜을 선언하기 위해서는 프로토콜에 AnyObject 키워드를 추가
반응형
'⌨️ Language > swift' 카테고리의 다른 글
[Swift] 클로저 (Closure) (0) | 2023.02.06 |
---|---|
[Swift] 익스텐션 (Extensions) (0) | 2023.02.06 |
[Swift] assert와 guard (0) | 2023.02.06 |
[Swift] 타입 캐스팅 (0) | 2023.02.06 |
[Swift] 클래스(Class)와 구조체(Struct) (0) | 2023.02.06 |
댓글