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

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

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