아이템 22. 일반적인 알고리즘을 구현할 때 제네릭을 사용하라

아이템 22. 일반적인 알고리즘을 구현할 때 제네릭을 사용하라

일반적인 알고리즘을 구현할 때 제네릭을 사용하라 #

타입 아규먼트를 사용하면 함수에 타입을 전달할 수 있다. 타입 아규먼트를 사용하는 함수를 제네릭 함수라고 부른다.

" 제네릭은 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 코드를 작성하자.