코틀린 확장 함수
코틀린에는 기존 클래스를 상속받지 않고도 기능을 추가할 수 있는 확장 함수라는 기능이 있습니다.
String 과 같이 final class 와 같이 상속이 불가능한 클래스도 확장 함수를 사용하면 기능을 추가할 수 있습니다.
이 글에서는 코틀린의 확장 함수가 어떤 방식으로 자바 코드로 변환되는지 확인 해보겠습니다
테스트 코드(ExtensionFunctionTest.kt)
fun String.lastChar() = this.get(this.length - 1)
테스트 코드(Executor.kt)
fun main() {
val ext = "Extension Function"
ext.lastChar()
}
String 클래스에 lastChar() 라는 확장 함수를 만드는 코드입니다. 이렇게 확장 함수를 만들면 아래와 같이 기존의 String 클래스의 메서드를 호출하는 방식으로 호출할 수 있습니다.
val lastCharacter = "test".lastChar()
확장 함수 class 파일
public final class ExtensionFunctionTestKt {
public static final char lastChar(@NotNull String $this$lastChar) {
Intrinsics.checkParameterIsNotNull($this$lastChar, "$this$lastChar");
return $this$lastChar.charAt($this$lastChar.length() - 1);
}
}
확장 함수를 호출하는 class 파일
public final class ExecutorKt {
public static final void main() {
String ext = "Extension Function";
ExtensionFunctionTestKt.lastChar(ext);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
}
테스트 코드를 컴파일 하여 생성된 class 파일을 디컴파일하면 위와 같이 변환된 것을 볼 수 있습니다.
확장 함수를 선언한 ExtensionFunctionTest.kt 파일은 코틀린 파일명+Kt(ExtionsionFunction + Kt) 인 클래스가 생성되고 내부에 확장 함수로 선언한 lastChar() 메서드가 static 메서드로 선언된 것을 볼 수 있습니다. 그리고 이 확장 함수를 사용 Executor.kt 파일은 확장 함수가 선언된 클래스의 static 메서드를 호출하는 방식으로 확장 함수를 사용하는 것을 볼 수 있습니다. 변환되는 방식을 몰랐을 때는 마냥 신기하기만 했는데 변환되는 과정을 살펴보니 어떻게 기존의 클래스를 상속받지 않고도 기능을 추가할 수 있는지 명확히 알게 되었습니다.