본문으로 건너뛰기

연관 타입과 프로토콜

프로토콜을 정의할 때 하나 이상의 연관 타입associated type을 정의하는 것이 유용한 경우가 있다. 연관 타입은 프로토콜 내에서 타입을 대신해 사용할 수 있는 플레이스홀더명placeholder name을 제공한다. 연관 타입에서 사용하는 실제 타입은 프로토콜이 채택 되기 전까지는 정의되지 않는다.

연관 타입을 정의하기 위해서는 associatedtype 키워드를 사용한다.

protocol Queue {
associatedtype QueueType
mutating func addItem(item: QueueType)
mutating func getItem() -> QueueType?
func count() -> Int
}

위 프로토콜에서는 QueueType 이라는 이름의 연관 타입을 정의했다. Queue 프로토콜을 구현하는 모든 타입은 QueueType 플레이스홀더를 위해 사용할 타입을 반드시 명시해야 하며, 프로토콜이 QueueType 플레이스홀더를 사용하는 경우 해당 타입의 아이템만이 사용됨을 보장해야만 한다.

protocol Queue {
associatedtype QueueType
mutating func addItem(item: QueueType)
mutating func getItem() -> QueueType?
func count() -> Int
}

struct MyQueue<T>: Queue {
var items = [T]()

mutating func addItem(item: T) {
items.append(item)
}

mutating func getItem() -> T? {
if items.isEmpty {
nil
} else {
items.remove(at: 0)
}
}
func count() -> Int {
items.count
}
}

제네릭을 활용한 큐 타입 프로토콜 활용

스위프트에서 제네릭은 컴파일 타임 단계가 아닌 런타임 단계에서 사용할 타입을 정의하게 해준다. 4장에서 제네릭과 함께 연관 타입을 사용하는 방법을 살펴보자.