여러분 자신의 클래스에 대해 확장을 정의하는 것이 때로는 더 간단한 코드를 생성하기도 한다.
ExtensionFunctions/BookExtensions.kt
package extensionfunctions
import atomictest.eq
class Book(val title: String)
fun Book.categorize(category: String) =
"""title: "$title", category: $category"""
fun main() {
Book("Dracula").categorize("Vampire") eq
"""title: "Dracula", category: Vampire"""
}
categorize() 안에서 아무것도 한정하지 않고 title 프로퍼티를 사용할 수 있다.
확장 함수는 확장 대상 타입(수신 객체 타입)의 public 원소에만 접근할 수 있다. 따라서 확장은 일반 함수가 할 수 있는 일만 처리할 수 있다. Book.categorize(String)은 categorize(Book, String)이라는 함수로 바꿔 쓸 수 있다. 확장 함수를 사용하는 이유는 오로지 this를 사용함으로써(또는 생략함으로써) 구문적 편의를 얻기 때문이다. 하지만 이런 문법 설탕(syntax sugar)은 강력하다. 호출하는 코드에서 확장 함수는 멤버 함수와 똑같아 보이고, IDE는 객체에 대해 점 표기법으로 호출할 수 있는 함수 목록에 확장을 포함시켜준다.