Kotlin 작성한 코드 Decompile



개인 광고 영역

내가 작성한 Kotlin 코드가 Java로 어떻게 표현되는지 궁금할 수 있다.

이런 경우 Android Studio에서 제공하는 byte 코드 Decompile을 통해 Java로 표현되는 코드를 확인할 수 있는데 이 글에서 간단하게 디컴파일 하는 방법을 살펴보려고 한다.

Kotlin Decompile

Android Studio에서 Kotlin 플러그인이 설치되어있다면, 실시간으로 Kotlin Bytecode 확인이 가능하다.

메뉴 위치는 Android Studio Tools > Kotlin > Show Kotlin Bytecode를 눌러주면 Kotlin Bytecode 화면이 보인다.

kotlin-bytecode-menu

아래와 같이 실시간 Kotlin Bytecode 확인이 가능한 창이 노출된다. 여기에서 Bytecode을 직접 확인하거나, Java 코드로 확인이 가능하다.

kotlin-bytecode

위의 그림에서 Decompile을 눌러주면 Java 코드로 디컴파일 결과 확인이 가능하다.


디컴파일 코드 살펴보기

Kotlin Bytecode는 실시간으로 컴파일된 결과물을 보여주는데, when으로 작성한 코드를

when (item.itemId) {
    R.id.navigation_home -> {
        message.setText(R.string.title_home)
        return@OnNavigationItemSelectedListener true
    }
    // ...
}

Bytecode로 보면 아래와 같다. bytecode에 보면 TABLESWITCH 문이 보인다.

INVOKEINTERFACE android/view/MenuItem.getItemId ()I
TABLESWITCH
  2131230822: L2
  2131230823: L3
  2131230824: L4
  2131230825: L5
  default: L3
L4
LINENUMBER 13 L4
ALOAD 0
GETFIELD com/example/taehwankwon/myapplication/MainActivity$mOnNavigationItemSelectedListener$1.this$0 : Lcom/example/taehwankwon/myapplication/MainActivity;
GETSTATIC com/example/taehwankwon/myapplication/R$id.message : I
INVOKEVIRTUAL com/example/taehwankwon/myapplication/MainActivity._$_findCachedViewById (I)Landroid/view/View;
CHECKCAST android/widget/TextView
LDC 2131623991
INVOKEVIRTUAL android/widget/TextView.setText (I)V
L6
LINENUMBER 14 L6
ICONST_1
IRETURN
L2

왜 switch 문이 보이는지는 디컴파일을 해보면 바로 확인이 가능하다.

switch(item.getItemId()) {
case 2131230822:
   ((TextView)MainActivity.this._$_findCachedViewById(id.message)).setText(2131623990);
   return true;
case 2131230823:
default:
   return false;
   // ...
}

Bytecode를 읽을 수 있으면 좋겠지만 익숙하지 않다. 그래도 대략 유추는 해볼 수 있으나 그냥 Decompile 버튼 눌러서 이렇게 Java 코드를 보는 편이 좋다.


마무리

다만 Java로 작성한 코드가 더 간결함이 느껴질 때가 많을 것이다. Kotlin에서 추구하는 코드는 좀 더 보수적인 경향이 강하니, 너무 신경 쓰지 말고 코딩하길 바란다.

어차피 그 정도 성능에 얽매여 활용성 높은 Kotlin을 써야 할까라는 고민은 하지 않길 바란다.

Google Android의 Feature는 Android P부터 Kotlin으로 작성한 앱에 대해서 더 기존 보다 더 빠른 성능을 낼 수 있도록 개선되었으며, Google I/O에 나온 내용들은 Kotlin Code로 가득했다. 더 이상 피할 수 없으니 학습하고, 즐기길 바란다.



About Taehwan

My name is Taehwan Kwon. I have developed Android for 6 years and blog has been active for eight years.

Comments