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로 가득했다. 더 이상 피할 수 없으니 학습하고, 즐기길 바란다.
Comments