Study/이펙티브코틀린

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

주지민 2022. 3. 29. 02:10
반응형

본 포스트는 사내 스터디를 진행하며 정리한 포스트입니다

https://book.interpark.com/product/BookDisplay.do?_method=Detail&sc.shopNo=0000400000&dispNo=&sc.prdNo=354452929&sc.saNo=002001023&bkid1=category&bkid2=ct028023&bkid3=c1&bkid4=001

 

싸니까 믿으니까 인터파크도서

실제 개발 사례를 통해 알려주는 코드 품질 향상 전략 이 책은 더 나은 코틀린 개발자가 될 수 있도록 도움을 주는 안내서입니다. 코틀린에 어떤 기능이 있는지, 어떤 표준 라이브러리가 있는지

book.interpark.com


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
반응형