제네릭 (Generic)
- 타입을 파라미터화 하여 컴파일 타임에 구체적인 타입이 결정되는 것을 의미
- 제네릭을 이용하면 타입에 유연하게 대처하는 것이 가능
- 제네릭으로 구현한 기능과 타입은 재사용에 용이
- 코드의 중복을 줄일 수 있어서 깔끔한 표현이 가능
- Swift에서의 대표적인 제네릭 타입으로는 Array와 Dictionary 타입이
- Array와 Dictionary는 Int 값을 저장할 수도 있고, String 값을 저장할 수도 있으므로, 타입에 제한이 없음
// String 타입을 갖는 두개의 값을 바꾸는 함수
func swapTwoStrings(_ a: inout String, _ b: inout String) {
let temporaryA = a
a = b
b = temporaryA
}
// Double 타입을 갖는 두개의 값을 바꾸는 함수
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let temporaryA = a
a = b
b = temporaryA
}
// 제네릭 타입을 활용하여 다양한 타입의 값을 바꾸는 함수
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
타입 파라미터 (Type Parameters)
- 위 swapTwoValues 함수의 예제에서 T는 타입 파라미터의 예시
- 타입 파라미터는 꺽쇠 괄호 (<>) 사이에, 견본 (placeholder) 타입을 지정한 다음에 이름을 지정하고, 함수의 이름 바로 뒤에 작성
- 타입 파라미터를 한번 선언하면 이 것을 함수의 타입으로 사용 가능
- 복수의 타입 파라미터를 사용할 때는 <T, U>와 같이 콤마로 구분
타입 파라미터 이름 짓기
- Dictionary와 같이 엘리먼트 간의 서로 상관관계가 있는 경우 의미가 있는 이름을 파라미터 이름으로 붙임
- 그렇지 않은 경우는 T , U , V와 같은 단일 문자로 파라미터 이름을 사용
- 값이 아니라 타입에 대한 placeholder 임을 가리키기 위해, 항상 타입 매개변수의 이름에는 카멜 표기법을 사용
타입 제약 사항
- 타입 제약사항은 타입 매개변수가 특정 클래스에서 상속되어야 하거나, 특정 프로토콜이나 프로토콜 합성을 준수하는 것을 지정
- 예를 들어, Swift의 Dictionary 타입은 딕셔너리의 키로 사용될 수 있는 타입을 Hashable로 제한
- 단일 클래스나 타입 매개변수 이름 뒤에 타입 매개변수 목록으로 콜론(:)으로 구분된, 프로토콜 제약사항을 위치시켜서 타입 제약사항을 작성
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U)
{
// ...
}
연관 타입 (Associated Types)
- 연관 타입(associated type)은 프로토콜에서 사용되는 타입에 placeholder 이름을 주는 것
- 연관 타입에 사용하는 실제 타입은 프로토콜이 채택될 때까지 지정되지 않음
- 연관 타입은 associatedtype 키워드로 지정
protocol Container {
associatedtype Item
mutating func append(_ item: Item)
var count: Int { get }
subscript(i: Int) -> Item { get }
}
제네릭 Where절
- 특정 프로토콜을 반드시 준수하는 연관된 타입을 가져오거나, 특정 타입 매개변수와 연관된 타입이 동일하게 하는 것이 가능
- where 키워드로 시작
- 연관된 타입 또는 타입과 연관된 타입 간의 동등한 관계에 대한 제약사항이 뒤따름
- 제네릭 where절을 타입이나 함수의 본문의 열린 중괄호({}) 바로 앞에 작성
extension Array where Element: FixedWidthInteger {
mutating func pop() -> Element { return self.removeLast() }
}
반응형
'⌨️ Language > swift' 카테고리의 다른 글
[Swift] 접근 제어 (Access Control) (0) | 2023.02.07 |
---|---|
[Swift] ARC (0) | 2023.02.07 |
[Swift] 에러 처리 (0) | 2023.02.07 |
[Swift] 고차함수 (0) | 2023.02.06 |
[Swift] 클로저 (Closure) (0) | 2023.02.06 |
댓글