일반적인 알고리즘을 구현할 때 제네릭을 사용하라 #
타입 아규먼트를 사용하면 함수에 타입을 전달할 수 있다. 타입 아규먼트를 사용하는 함수를 제네릭 함수라고 부른다.
" 제네릭은 List
또는 Set 처럼 구체적인 타입으로 컬렉션을 만들 수 있게 클래스와 인터페이스에 도입된 기능입니다. “
제네릭 제한 #
구체적인 타입의 서브타입만 허용하도록 제한할 수도 있다.
// 콜론 뒤에 상위 타입 명시 `T: Comparable<T>`
fun <T : Comparable<T>> Iterable<T>.sorted(): List<T> {
...
많이 사용하는 제한 타입으로 Any 가 있다. 이는 nullable 이 아닌 타입을 명시할 때 사용한다.
의미가 있나 싶었는데, nullable 을 체크하는 목적으로 사용한다고 한다. :thumbsup:
inline fun <T, R : Any> Iterable<T>.mapNotNull(
transform: (T) -> R?
): List<R> {
...
}
드물지만 둘 이상의 제한을 걸 수도 있다.
fun <T: Animal> pet(animal: T) where T: GoodTempered {
...
}
// 또는
fun <T> pet(animal: T) where T: Animal, T: GoodTempered {
...
}
where-clause #
where-clause 관련해서는 아래 문서를 참고해보자.
참고 : Generic constraints
요약 #
제네릭을 이용해서 type-safe 코드를 작성하자.