Uing? Uing!!

[안드로이드 팁] Java로 디컴파일(Decompile)해서 코드 이해하기 본문

Android

[안드로이드 팁] Java로 디컴파일(Decompile)해서 코드 이해하기

Uing!! 2020. 11. 17. 12:06
반응형

코드를 뜯어보고 싶어요

안드로이드 개발을 조금 하다 보면 같은 기능을 하는 코드이더라도 여러가지 방법으로 전개가 가능한 경우가 많다.

특히 자바에서 코틀린으로 넘어오면서 느낀 점 중 하나가 정말 다양한 방식의 코드를 간결한 문법으로 지원해준다는 점이다.

이건 코틀린의 큰 장점이지만, 공부를 하는 입장에서는 간혹 코드만 봐서는 성능 상에 어떤 차이가 있는지 알 수 없을 때가 있다.

 

'Kotlin의 이 문법은 Java에서는 어떤 방식으로 전개되는 거지?'

'이 함수를 여기에 정의하면 전역 static으로 정의되는 건가?'

'Null-check를 이렇게 간결하게 하면 실제로는 어떤 방식으로 체크하는 걸까?'

 

등등의 의문은 Kotlin 코드를 좀 더 명확하게 표시된 Java 코드의 형태로 바꾸어 보는 것으로 해소할 수 있다.

 

안드로이드 스튜디오의 Decompile

Complile이라고 함은, 우리가 아는 Java에서 컴퓨터가 수행할 수 있는 Bytecode의 형태로 변환하는 작업을 말한다.

그 반대의 의미를 갖는 Decompile은 이미 컴파일된 Bytecode를 다시 Java 형태로 돌려놓는 작업을 말한다.

 

그래서 우리가 Kotlin에서 Java 코드를 찾아갈 방법은 이렇다.

 

1) Kotlin -> Bytecode (Compile)

2) Bytecode -> Java (Decompile)

 

안드로이드 스튜디오에서는 1)과 2)의 기능을 연속적으로 수행할 수 있도록 인터페이스를 제공한다.

아래 Kotlin String Templates를 활용한 코드를 예시로 들어 이 과정을 따라가 보자.

 

 

1) Kotlin -> Bytecode (Compile)

안드로이드 스튜디오의 Tools > Kotlin > Show Kotlin Bytecode를 사용해 바이트코드를 확인할 수 있다.

 

변환된 바이트코드는 아래처럼 우측에 나타난다.

 

바이트코드만으로도 이해할 수 있다면 좋지만, 솔직히 함수명 빼고는 읽고 싶지 않게 생긴 코드다.

따라서 2번으로 넘어가자.

2) Bytecode -> Java (Decompile)

변환된 바이트코드 란의 왼쪽 위를 보면 'Decompile' 이라는 버튼이 있다.

이 버튼을 누르면 메인 탭에서 변환된 Java 코드를 볼 수 있다.

 

Kotlin의 String Template은 Java에서는 결국 +로 값들을 연결하여 출력하는 코드와 같다는 것을 확인할 수 있다.

포스팅에서는 아주 간단한 예시를 들었지만, Kotlin에서 더욱 추상화된 개념들을 구체적으로 이해하고 싶을 때 Decompile 기능을 사용하면 상당히 유용하다.

 

반응형
Comments