[코틀린인액션] 확장함수

확장 함수 정의 방법

  • String 클래스에 lastChar 라는 확장 함수를 추가하려면?
package strings

fun String.lastChar(): Char = this.get(this.length - 1)
  • this
    • 수신 객체를 의미합니다
  • String 클래스의 인스턴스에 대해 호출가능
fun main() {
    println("Kotlin".lastChar())
}
//n
  • "Kotlin"
    • 이 수신 객체가 되며
      • lastChar 확장함수는
      • String 의 일부처럼 호출이 가능하다.

특징

캡슐화

  • 확장함수는 캡슐화를 깨지 않는다
  • private 와 protected 는 접근할 수 없다.
  1. 호환성면
    1. 자바나 코틀린 등의 언어와 관계없이 JVM 언어로 작성된 클래스에 적용이 가능하다.
  1. 유연성
    1. 기존 클래스의 코드 변경 없이 새로운 메서드를 추가가능하다.

확장함수 응용

fun <T> Collection<T>.joinToString(
    separator: String = ", ",
    prefix: String = "",
    postfix: String = ""
): String {
    val result = StringBuilder(prefix)
    for ((index, element) in this.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(element)
    }
    result.append(postfix)
    return result.toString()
}
  • Collection<T> 에 확장 함수를 정의하는 방법?
    • this 를 통해 확장 함수가 호출되는 수신 객체
      • Collection<T> 인스턴스를 가리킨다.
println(list.joinToString(separator = "; ", prefix = "(", postfix = ")"))
joinToString = (one two eight)

확장 함수의 한계점

  1. 오버라이딩 불가
    1. 오버라이딩 불가능
    1. 하위 클래스에서 확장 함수를 재정의하는 것은 불가능
  1. 정적 메서드로 취급
    1. 내부적으로 확장 함수는 해당 클래스의 정적 메서드로 컴파일됨.
    1. 확장 함수가 수신 객체의 private protected 등의 멤버가 접근할 수 없음

Uploaded by N2T