코틀린은 바이트 코드인 .class
파일로 빌드되고 JVM 위에서 실행됩니다.
그래서 코틀린 코드를 자바로 변환하는 방법은 .class
파일을 Java로 decompile하면 됩니다.
이 글에서는 jadx와 IntelliJ를 이용하여 디컴파일하는 모두 알아보겠습니다.
- jadx 라는 툴로 decompile
- IntelliJ IDE로 decompile
IntelliJ IDE로 코틀린을 자바로 변환
아래 코드는 작업 디렉토리를 출력하는 코틀린 코드입니다. IntelliJ에서 프로젝트를 만들어 아래 코드가 동작하도록 만듭니다.
fun main(args: Array<String>) {
val path = System.getProperty("user.dir")
println("Working Directory = $path")
}
실행해보면 아래와 같이 출력이 됩니다.
Working Directory = /home/user/testcode/kotlin
이제 위의 코드를 자바로 변환해보겠습니다.
IntelliJ에서 아래 메뉴를 따라 들어갑니다. [Tools] -> [Kotlin] -> [Show Kotlin bytecode]
이 메뉴는 코틀린 코드를 바이트코드로 볼 수 있는 메뉴입니다.
스크린샷처럼 오른쪽에 탭이 생깁니다. 이 탭에서 Decompile
버튼을 누르면 자바로 변환이 됩니다.
버튼을 누르면 변환된 자바 파일이 생성됩니다. 코드는 다음처럼 보일 것입니다.
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
@Metadata(
mv = {1, 1, 13},
bv = {1, 0, 3},
k = 2,
d1 = {"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005¨\u0006\u0006"},
d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "kotlin"}
)
public final class Kotlin15Kt {
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
String path = System.getProperty("user.dir");
String var2 = "Working Directory = " + path;
System.out.println(var2);
}
}
위의 자바 코드는 바이트 코드를 변환한 것이기 때문에 가독성이 좋지 않습니다. 하지만 코틀린이 어떻게 자바로 표현되는지 이해하는데 좋습니다.
Jadx 툴을 이용하여 코틀린을 자바로 변환
IntelliJ IDE를 설치하셨다면, 위의 방법으로 변환하시는 것이 좋습니다. 하지만 만약 IntelliJ를 설치하지 않았다면 다른 툴을 사용해서 변환할 수 있습니다. Jadx라는 툴은 바이트 코드를 자바 코드로 변환하는 기능을 제공합니다.
Jadx는 바이트 코드 외에 안드로이드의 Apk, 또는 Dex 파일도 변환해줍니다. 자세한 것은 'Android 앱(apk)을 decompile하는 방법'을 참고해주세요
Jadx 설치
Jadx는 Jadx-release에서 빌드된 파일을 다운받을 수 있습니다. Jadx는 command line과 GUI 툴을 모두 제공합니다.
툴을 다운받고 압축을 풉니다. bin 폴더를 보면 실행 파일이 있습니다. jadx는 command line 툴이고, jadx-gui는 GUI 툴입니다. 저는 command line을 사용하겠습니다. (Windows 사용자의 경우 jadx-gui.bat을 사용해야 합니다)
jadx-0.8.0$ ls
bin lib LICENSE NOTICE README.md
jadx-0.8.0$ ls bin
jadx jadx.bat jadx-gui jadx-gui.bat
위와 마찬가지로 ~/.bashrc
에 alias로 jadx를 등록하였습니다.
#jadx
alias jadx='/home/user/test/jadx-0.8.0/bin/jadx'
jadx를 실행해보면 설치가 잘 된 것을 확인할 수 있습니다.
$ jadx -h
jadx - dex to java decompiler, version: 0.8.0
usage: jadx [options] <input file> (.apk, .dex, .jar or .class)
...
Jadx로 디컴파일
Jadx는 바이트 코드를 자바로 변환해주는 툴입니다. 코틀린 코드는 설치하신 툴로 컴파일해주세요.
컴파일의 산출물을 보면 .class
파일들이 생성되어있습니다. 이 파일들이 바이트 코드입니다.
Jadx를 이용하여 아래처럼 명령어를 입력하면 class파일이 Java로 변환됩니다.
$ jadx -d output Kotlin15Kt.class
output은 파일이 저장될 폴더 위치이고, Kotlin15Kt.class는 변환할 바이트코드 파일입니다.
변환된 파일을 보면 아래처럼 변환이 되었습니다.
package foo.main.kotlin;
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
@Metadata(bv = {1, 0, 3}, d1 = {"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005¨\u0006\u0006"}, d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "kotlin"}, k = 2, mv = {1, 1, 13})
/* compiled from: kotlin15.kt */
public final class Kotlin15Kt {
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
System.out.println("Working Directory = " + System.getProperty("user.dir"));
}
}
정리
코틀린을 자바코드로 변환하는 방법에 대해서 알아보았습니다. IntelliJ IDE를 사용하시면 빠르게 확인해볼 수 있습니다. 가독성은 안좋지만, 디컴파일은 코틀린이 자바에서 어떻게 표현되는지 확인하는데 큰 도움이 됩니다.
Related Posts
- Kotlin - 배열에서 최소 값, 최대 값 찾기
- Kotlin - 2차원 배열 선언, 초기화 방법
- Kotlin - 배열 선언, 초기화 방법
- Kotlin - 리스트, 배열 길이 가져오기
- Kotlin - 리스트에서 최대, 최소 값 찾기
- Kotlin - for 반복문, 배열/리스트 순회
- Kotlin - Timer, 주기적으로 함수 실행
- Kotlin - sleep, 쓰레드 몇 초 지연
- Kotlin - Thread 생성 및 실행
- Kotlin에서 정규표현식 사용하기
- Kotlin - 문자열 길이 계산
- Kotlin - 문자열 비교 방법(equals, ==, compareTo)
- Kotlin - 2개의 배열 하나로 합치기
- Kotlin - 2개의 List 하나로 합치기
- Kotlin - 디렉토리의 모든 파일 리스트 출력
- Kotlin - 리스트 정렬 방법 (sort, sortBy, sortWith)
- Kotlin - 문자열 뒤집기 (Reverse String)
- Kotlin - 랜덤 숫자 생성 (Random, SecureRandom)
- Kotlin - Range, 숫자 범위 표현
- Kotlin - 음수를 양수로 변환, math.abs()
- Kotlin - List를 Set로 변환
- Kotlin - Set를 List로 변환
- Kotlin - 문자열에서 숫자(int)만 추출하는 방법
- Kotlin - Map을 List로 변환하는 방법
- Kotlin - File, Directory가 존재하는지 확인
- Kotlin - List를 Map으로 변환
- Kotlin - List의 중복 요소 제거
- Kotlin - List를 Array로 변환
- Kotlin - 엘비스 연산자 (Elvis Operation)
- Kotlin - Array를 List로 변환
- Kotlin - String을 Float으로 변환
- Kotlin - String을 Double으로 변환
- Kotlin - String을 Int로 변환
- Kotlin - String을 Long으로 변환
- Kotlin - String Null 또는 Empty 체크