일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- github submodule
- Android Studio
- 서브모듈 sourcetree
- Android
- firebase
- 목서버
- 앱개발
- 서브모듈 pull
- 안드로이이드 submodule
- 안드로이드개발
- 쿼터뷰
- java
- GIT
- 내 맘대로 정리한 안드로이드
- submodule sourcetree
- 개발
- DataBinding
- 게임개발
- 코틀린
- 타이쿤
- 티스토리
- Unity
- Kotlin
- gitlab submodule
- 카페오냥
- 2d게임
- 앱
- 유니티
- 안드로이드
- github
- Today
- Total
Uing? Uing!!
[안드로이드 팁] Java로 디컴파일(Decompile)해서 코드 이해하기 본문
코드를 뜯어보고 싶어요
안드로이드 개발을 조금 하다 보면 같은 기능을 하는 코드이더라도 여러가지 방법으로 전개가 가능한 경우가 많다.
특히 자바에서 코틀린으로 넘어오면서 느낀 점 중 하나가 정말 다양한 방식의 코드를 간결한 문법으로 지원해준다는 점이다.
이건 코틀린의 큰 장점이지만, 공부를 하는 입장에서는 간혹 코드만 봐서는 성능 상에 어떤 차이가 있는지 알 수 없을 때가 있다.
'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 기능을 사용하면 상당히 유용하다.