Study/이펙티브코틀린
Item 22. 일반적인 알고리즘을 구현할 때 제네릭을 사용하라
주지민
2022. 3. 29. 02:10
반응형
본 포스트는 사내 스터디를 진행하며 정리한 포스트입니다
1. 제네릭 함수
- 타입 아규먼트를 가지고 있는 함수
- 즉 타입 파라미터를 갖는 함수
- 대표예) filter 함수
inline fun <T> Iterable<T>.filter(
predicate: (T) -> Boolean
): List<T> {
for (element in this) {
if (predicate(element)) {
destination(element)
}
}
return destination
}
- 타입 파라미터는 컴파일러에 타입과 관련된 정보를 제공하여 컴파일러가 타입을 조금이라도 더 정확하게 추측할 수 있게 해준다
- 프로그램이 조금 더 안전해지고, 개발자는 프로그래밍이 더 편해진다
- 제네릭은 기본적으로 List<String>, Set<User>처럼 구체적인 타입으로 컬렉션을 만들 수 있게 클래스와 인터페이스에 도입된 기능이다
- 컴파일 과정에서 최종적으로 타입 정보는 사라지지만, 개발 중에는 특정 타입을 강제할 수 있습니다
2. 제네릭 제한
- 타입 파라미터의 중요한 기능 중 하나는 구체적인 타입의 서브타입만 사용하게 타입을 제한하는 것
- 예제 ( 콜론 뒤에 슈퍼타입으로 제한 )
fun <T : Comparable<T>> Iterable<T>.sorted(): List<T> {
/* .. */
}
fun <T, C: MutableCollection<in T>>
Iterable<T>.toCollection(destination: C): C {
/* .. */
}
class ListAdapter<T: ItemAdapter>(/* .. */) {
/* .. */
}
- 위처럼 슈퍼타입으로 제한을 걸면, 내부에서 해당 타입이 제공하는 메서드를 사용할 수 있습니다
- 많이 사용하는 제한으로는 Any, nullable이 아닌 타입을 의미
3. 정리
- 타입 파라미터를 사용하여 type-safe 제네릭 알고리즘과 제네릭 객체를 구현합니다
- 타입 파라미터는 구체 자료형(concreate type)의 서브타입을 제한할 수 있습니다
- 이렇게 특정 자료형이 제공하는 메서드를 안전하게 사용할 수 있습니다
728x90
반응형