[swift] 프로토콜의 연관 타입 (associated types) 사용법

프로토콜은 특정 작업 또는 기능에 필요한 메서드, 속성 및 기타 요구 사항의 청사진을 제공합니다. 프로토콜을 정의할 때 연관 타입을 사용하여 특정 연관 타입이 어떤 타입인지 프로토콜 내에서 정의할 수 있습니다. 이 연관 타입은 프로토콜을 채택하는 컨테이닝 타입에 따라 실제 타입으로 대체되며, 제네릭 타입을 선언할 때 유용하게 활용됩니다.

연관 타입 정의하기

프로토콜 내에 연관 타입을 정의할 때는 associatedtype 키워드를 사용합니다.

protocol Container {
    associatedtype Item
    func addItem(_ item: Item)
    var count: Int { get }
}

위의 예시에서 Container 프로토콜은 Item이라는 연관 타입을 가지고 있습니다. 이렇게 연관 타입을 정의함으로써 Container 프로토콜을 채택하는 구조체나 클래스에서 실제 타입을 지정할 수 있습니다.

연관 타입 사용하기

연관 타입을 사용하는 예시로 구조체 Stack을 구현해보겠습니다.

struct Stack<T>: Container {
    typealias Item = T
    var items = [T]()
    
    mutating func addItem(_ item: T) {
        items.append(item)
    }
    
    var count: Int {
        return items.count
    }
}

위의 예시에서 Stack 구조체는 ItemT로 대체하여 Container 프로토콜을 채택하고 있습니다. 이제 Stack 구조체는 addItem 메서드와 count 속성을 가져야 합니다.

결론

프로토콜의 연관 타입은 제네릭이나 일반적인 타입을 사용하는 곳에 유용하게 활용될 수 있습니다. 연관 타입을 사용하여 프로토콜을 보다 유연하게 정의하고, 프로토콜을 채택하는 타입에서 실제 타입을 지정할 수 있습니다. 이를 통해 코드의 재사용성과 유연성을 높일 수 있습니다.

참고: Swift.org - Protocols