프로토콜 (Protocol)
- 메서드, 속성 및 기타 요구사항의 청사진 (blueprint)를 정의하여 클래스, 구조체 또는 열거형에서 구현할 수 있는 일종의 인터페이스이다.
- Class, Structure, Enum 이 Protocol를 채택하고, 모든 요구사항을 충족하면 Protocol를 준수헀다고 한다.
- 프로토콜은 설계된 조건만 정의를 하고 실제로 기능을 구현하지는 않는다.
- 프로퍼티는 항상
var
를 사용한다.
- 프로토콜은 다중 상속이 가능하다.
protocol 프로토콜 {
var 프로퍼티 : 타입 { get set }
}
class 클래스 : 부모클래스, 프로토콜1, 프로토콜2.. {
}
protocol Vehicle {
var speed : Double {get set}
var manufacturer : String { get }
}
class Car : Vehicle{
var speed : Double = 0.0
var manufacturer : String = "To"
}
AssociatedType , Typealias
AssociatedType
은 프로토콜 내에서 실제 타입을 명시하지 않고, 해당 프로토콜을 채택하는 타입에서 실제 타입을 결정하도록 하는데 사용된다.
AssociatedType
뒤에 있는 단어는 연관 타입이라고 하며, 해당 프로토콜을 채택하는 struct든 Class 는 해당 연관타입을 하나로 정해서 사용해야 한다.
Typealias
는 타입의 이름을 다른이름으로도 사용할 수 있게끔 해주는 것이다.
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
func item(at index: Int) -> Item
}
struct IntContainer: Container {
typealias Item = Int
var items = [Int]()
var count: Int {
return items.count
}
mutating func append(_ item: Int) {
items.append(item)
}
func item(at index: Int) -> Int {
return items[index]
}
}
var intBox = IntContainer()
intBox.append(5)
intBox.append(10)
print(intBox.item(at: 0))