Closed Glsme closed 1 year ago
타입에 의존하지 않는 범용 코드를 작성할 때 사용한다. 사용 시 중복을 피할 수 있고, 코드를 유연하게 작성할 수 있다. 흔하게 사용하는 Array나 Dictionary도 제네릭 타입으로 구성되어 있음!
Generic은 Swift의 강력한 특징 중 하나. Swift의 표준 라이브러리의 대부분은 Generic으로 빌드됨. 예를 들어 Array, Dictionary 도 Generic Collection.
아래의 nongeneric 함수의 경우 두 값을 바꾸기 위해 inout
을 사용했다.
func swapStrings(_ a: inout String, _ b: inout String) {
let temp = a
a = b
b = temp
}
두 값을 바꾸기에 유용하지만, String 형태의 값만 바꿀 수 있다. 다른 타입의 값을 바꾸고 싶다면 해당 타입을 받는 함수를 추가적으로 만들어야하지만, 값을 바꾸는 함수의 내부 바디는 어떤 형태이든 동일할 것이다.
func swapValues<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
위와 Generic 함수는 어떤 타입과도 작동할 수 있다.
Generic을 이용한 함수는 실제 타입 이름이 아니라, placeholder 타입 이름 (위 코드에서는 T)을 사용한다.
이 placeholder 타입 이름은 T가 무엇인지 말하지 않지만, 매개변수 a와 b가 둘 다 같은 타입 T라는 것을 명시한다. T 자리에 사용되는 실제 타입은 swapTwoValues(_:_:)
함수가 호출될 때마다 결정이 된다.
<T>
이 꺽쇠를 통해 Swift에게 T는 해당 함수의 placeholder 타입 이름이라는 것을 명시한다. T가 플레이스홀더이므로 Swift가 T라는 실제 타입을 찾아헤매지 않는다.
위 예시로 든 플레이스홀더 타입 T는 타입 파라미터의 한 예. 꺽쇠 안에 콤마로 여러개의 타입파라미터를 작성할 수 있다.
<T, U, K>
타입 파라미터는 설명적인 이름을 가진다. 예를 들면 Dictionary<Key, Value
또는 Array<Element>
처럼. 읽는 사람에게 타입 파라미터와 제네릭 타입, 또는 사용되는 함수에 대한 관계를 알려줄 수 있도록. 하지만 의미있는 관계가 그 사이에 없다면 보통은 하나의 문자 T
, U
, V
를 사용하는 것이 전통적인 형태.
이때 타입파라미터는 Upper camel case로 네이밍해서, 값이 아니라 타입에 대한 Placeholder라는 것을 명시한다.
Generic이란 타입에 제한을 두지 않는 코드를 작성할 때 사용 코드의 중복을 피해 재사용 가능한 함수를 만들 수 있다.
2022.12.23(금) 모임전까지 작성해주세요.