몰?.루();

코틀린 확장 함수는 자바에서 어떻게 구현될까? 본문

프로그래밍/안드로이드, 코틀린

코틀린 확장 함수는 자바에서 어떻게 구현될까?

toonraon 2023. 2. 16. 23:57

코틀린에는 확장 함수가 존재합니다.

이미 있는 클래스에 내가 원하는 기능의 함수를 추가할 수 있습니다.

 

fun String.isHello(): Boolean {
    return (this == "hello")
}

예를 들어 위와 같이 어떤 문자열이 "hello"인지 판단해주는 아주 쓸모 없는 확장 함수를 제가 직접 만들 수 있습니다.

이렇게 확장 함수를 만들어놓으면

 

    "hello".isHello() // true
    
    "hi".isHello()    // false

이런 식으로 String 뒤에 점(.)을 붙이고 isHello()를 해서 마치 코틀린 자체에서 isHello라는 String 함수를 추가해놓은 것처럼 사용할 수 있습니다.

 

근데 이 확장 함수 기능은 자바에는 없습니다.

자바 파일에 가서 아무리 "hello".isHello();를 입력해봤자 그런 함수 없다면서 컴파일 에러만 뜹니다.

 

근데 코틀린은 자바와 100% 호환되게 만들어두었습니다.

그럼 대체 코틀린은 자바에 원래 없는 확장 함수라는 기능을 어떻게 만들어놓은 걸까요?

 

isHello() 함수가 있는 코틀린 코드를 바이트 코드로 변환한 후에 자바 코드로 디컴파일하면

코틀린 함수가 내부적으로 자바로 어떻게 구현이 되어있는지 볼 수 있습니다.

 

Tools > Kotlin > Show Kotlin Bytecode 를 누르면 오른쪽에 창이 뜨는데

 

Decompile 버튼을 누르면 이 바이트 코드가 자바 코드로 변환됩니다.

 

...

public final class MainKt {
   public static final boolean isHello(@NotNull String $this$isHello) {
      Intrinsics.checkNotNullParameter($this$isHello, "$this$isHello");
      return Intrinsics.areEqual($this$isHello, "hello");
   }
}

...

이렇게 변환됩니다.

여기서 눈 여겨 봐야하는 부분은 클래스 명입니다.

원래 코틀린 파일의 클래스명은 그냥 Main로 지어놨었습니다.

코틀린 확장자가 .kt니까 합치면 Main.kt죠.

 

Main 클래스 외에 MainKt 클래스를 추가로 생성한 겁니다. (위 코드에선 Main 클래스 부분은 생략해서 보여줬습니다.)

그리고 이 클래스에 static 함수로 isHello가 생성되었습니다.

 

그래서 자바 파일에서 이 확장 함수를 쓸 때는 코틀린처럼 쓸 수 없고

마치 그냥 static 함수 쓸 때처럼

MainKt.isHello("hello");

이렇게 사용해야합니다.

String 클래스와는 아무 관련 없이 그냥 MainKt라는 클래스를 새로 만들고 거기에 isHello 라는 함수를 추가했을 뿐이죠.

Comments