더북(TheBook)

여러분 자신의 클래스에 대해 확장을 정의하는 것이 때로는 더 간단한 코드를 생성하기도 한다.

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는 객체에 대해 점 표기법으로 호출할 수 있는 함수 목록에 확장을 포함시켜준다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.