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
확인이 가능한 창이 노출된다. 여기에서 Bytecode을 직접 확인하거나, Java 코드로 확인이 가능하다.
위의 그림에서 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로 가득했다. 더 이상 피할 수 없으니 학습하고, 즐기길 바란다.