kotlin

코틀린 확장 함수

android by kotlin 2022. 10. 26. 18:25

코틀린에는 기존 클래스를 상속받지 않고도 기능을 추가할 수 있는 확장 함수라는 기능이 있습니다.

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 메서드를 호출하는 방식으로 확장 함수를 사용하는 것을 볼 수 있습니다. 변환되는 방식을 몰랐을 때는 마냥 신기하기만 했는데 변환되는 과정을 살펴보니 어떻게 기존의 클래스를 상속받지 않고도 기능을 추가할 수 있는지 명확히 알게 되었습니다.