함수와 커스텀 타입(구조체, 클래스, 열거형)에서 제네릭을 구현하는 방법은 서로 비슷했지만, 프로토콜에서 제네릭을 구현하는 방법은 조금 다릅니다.
프로토콜의 제네릭 타입 구현은 프로토콜 내부에 "associatedtype" 키워드를 사용하여 타입 파라미터 "T"를 선언해야 합니다.
✅ 함수, 커스텀 타입, 프로토콜의 제네릭 타입 구현
//함수 func funcName<T>{ <관련 코드> } //구조체 struct StructName<T>{ <관련 코드> } //클래스 class ClassName<T>{ <관련 코드> } //열거형(연관 값(Associated Value)을 가질 때만 제네릭으로 정의 가능) enum EnumName<T>{ <관련 코드> }
//프로토콜 protocol ProtocolName{ associatedtype T <관련 코드> }
✅ 프로토콜(Protocol)에서의 제네릭(Generics) 활용
typealias T = String // 타입 파라미터 T의 타입을 미리 정의
제네릭 프로토콜 타입을 채택하여 사용할 때는 미리 타입 파라미터를 정의하여 사용할 수 있습니다.
⬇️ 제네릭 프로토콜 타입을 사용한 예시
protocol ProductInformation{ // 제네릭 프로토콜 정의 associatedtype T var productPrice: T?{get set} func pricePrint(price: T) -> T } struct TV: ProductInformation{ typealias T = String // 타입 파라미터 T의 타입을 미리 정의 var productPrice: T? func pricePrint(price: T) -> T { return price } } struct Americano: ProductInformation{ //typealias T = Type // 생략 가능 var productPrice: T? func pricePrint(price: Int) -> Int { return price } } var samsungTV = TV() // samsungTV 인스턴스는 String 타입으로만 생성 가능합니다. print(samsungTV.pricePrint(price: "백만원")) var starbucksAmericano = Americano() // starbucksAmericano 인스턴스는 Int 타입으로만 생성 가능합니다. print(starbucksAmericano.pricePrint(price: 5000)) /* 출력 결과 백만원 5000 */