붉은외계인 Dev Blog
외계인의 성장 기록

🧩 Language

외계인의 관점에서 정리한 각종 지식들을 탐험해보세요 🚀

📱

Kotlin : Java와 100% 호환되는 이유

0. Kotlin이란 GitHub - JetBrains/kotlin: The Kotlin Programming Language.The Kotlin Programming Language. . Contribute to JetBrains/kotlin development by creating an account on GitHub.github.com다들 아시는 내용이겠지만 Kotlin은 JetBrains에서 개발한 멀티 패러다임 언어입니다Kotlin은 Java, Python 등 많은 프로그래밍 언어들처럼 오픈 소스이며, Github에 코드가 오픈되어 있습니다위에 링크를 클릭하면 코드들을 볼 수 있습니다 논외로, Kotlin에 로고 변천사는 위와 같습니다 개인적으로, 현재 로고인 보라색 로고가 저는 가장 마음에..

🛸
축하합니다!
포스트를 모두 읽으셨습니다! 👽✨
⏱️ 읽기 시간
계산중...
소요되었습니다
🧩 Language/🔥 Kotlin

Kotlin : Java와 100% 호환되는 이유

🗓️ 2025. 6. 25. 10:23
⏱️ 계산 중...
반응형

0. Kotlin이란

 

GitHub - JetBrains/kotlin: The Kotlin Programming Language.

The Kotlin Programming Language. . Contribute to JetBrains/kotlin development by creating an account on GitHub.

github.com

다들 아시는 내용이겠지만 Kotlin은 JetBrains에서 개발한 멀티 패러다임 언어입니다
Kotlin은 Java, Python 등 많은 프로그래밍 언어들처럼 오픈 소스이며, Github에 코드가 오픈되어 있습니다
위에 링크를 클릭하면 코드들을 볼 수 있습니다

 


논외로, Kotlin에 로고 변천사는 위와 같습니다  개인적으로, 현재 로고인 보라색 로고가 저는 가장 마음에 드네요

 


 

1. 기계어( Machine Code )와 어셈블리어( Assembly Language )

 

Kotlin이 Java와 100% 호환되는 이유를 정확히 이해하기 위해서는 기계어와 어셈블리어를 먼저 이해할 필요가 있습니다

 

기계어는 CPU가 이해하는 언어로, CPU는 해당 언어를 읽어들여 연산을 수행합니다 ( 2진수 형태 )
그리고 어셈블리어는 해당 기계어를 사람이 읽고 쓰기 쉬운 형태로 1:1 대응시켜 놓은 언어입니다 ( 니모닉 형태 )
그림을 보면 단 번에 이해가 됩니다

 

 

기계어는 위의 그림과 같이 Opcode + Operand의 구조로 이루어져 있습니다 이 전체를 통틀어 명령어라고 부릅니다
우리가 프로그램을 실행하면 이러한 2진수 형태의 명령어들이 가상 메모리내에 올라갑니다 ( 정확하게는 Code 영역 )
그 외 2진수로 기록된 데이터들은 나머지 영역에 올라갑니다 ( 부가 설명을 할려면 리버싱까지 넘어가기에 생략하겠습니다 )

그림에서 기계어 명령어의 의미는 CPU에게  "AX 레지스터와 BX 레지스터의 값을 더하라"는 의미입니다

 

해당 명령어의 구조인 Opcode + Operand를 사람이 이해하기 쉬운 짧은 영단어인 니모닉으로
각각 
1:1 매칭시켜놓은 것이 바로 어셈블리어입니다

 

 

 

디버깅을 통해 메모리를 직접 살펴보면 위의 모습과 같습니다 ( 해당 사진은 가상 메모리 영역중 Code 영역 )
직접 살펴보면 일반적으로, 2진수 형태가 아닌 16진수로 표현되어 있습니다 
이것은 단지 2진수를 16진수로 변환한 것입니다

 

 


반응형

2. 컴파일 과정

그렇다면 왜 어셈블리어와 기계어를 먼저 언급했을까요?
바로 아래 그림을 이해하기 위해서입니다

 

Java는 위와 같은 과정을 거쳐 기계어 형태로 변환된 후, CPU에 전달되어 실행됩니다
여기서 우리가 눈여겨 보아야 할 포인트는 JVMJava ByteCode입니다

 

JVM은 Java Virtual Machine의 약자이며, 이름 그대로 가상 머신입니다
그리고 CPU의 다른 이름은 Machine 입니다
즉, Java Virtual Machine은 다른 말로 Java Virtual CPU라고 볼 수 있습니다

 

 

앞에서 배웠듯 CPU에서는 기계어가 해석됩니다
그렇다면 Java Virtual CPU라는 가상 CPU에서 해석되는 기계어 또한 존재 할 것입니다
그것이 바로 Java ByteCode입니다 Java 가상 CPU라는 환경에서 기계어로 취급되는 것이 바로 Java ByteCode입니다
바로 위의 그림과 같습니다 ( IntelliJ에서 View - Show Bytecode를 클릭하면 볼 수 있습니다 )

 

01


그렇다면 기계어인 Java ByteCode와 1:1로 대응되는 어셈블리어 또한 존재할 것입니다
 Java 가상 CPU라는 환경에서의 기계어인 Java ByteCode의 어셈블리어는 바로 Jasmin입니다

 

Jasmin을 보기 위해서는 Windows 전용인 jhoja라는 도구를 이용해야 합니다
1번 사진은 jhoja를 통해 Jasmin으로 변환하는 과정이고, 2번 사진은 Jasmin 파일을 열어본 결과 입니다

 


 

3. 그니까 Kotlin이 Java와 100% 호환되는 이유는...

쓰다보니 서론이 길어졌습니다

 

결론적으로, Kotlin이 Java와 100% 호환이 가능한 이유는 Kotlin 파일을 Java ByteCode로 컴파일 하기 때문입니다
어차피 JavaByteCode로만 컴파일하면 JVM에서 동일하게 실행이 가능하니까요

 

 


 

4. Android도 비슷하다

현재 Java보다는 Kotlin이 자주 사용되는 Android 환경에서는 어떨까요? Android 환경에서의 컴파일 과정은 살짝 다릅니다
아래 그림을 보겠습니다

 

 

JVM이라는 가상 머신 대신에 ART( Android RunTime )라는 가상 머신으로 대체됐습니다
그리고 Java ByteCode를 한 번더 컴파일하여 .dex라는 파일로 변환하고 해당 파일을 ART에서 실행합니다
ART가 .dex 파일을 실행하면 해당 파일을 기계어로 번역하여 CPU에게 전달되면서 실행이 되는 구조입니다

눈치채셨겠지만 ART라는 가상 CPU에서의 기계어가 바로 .dex 파일에 기록된 것들이고 
해당 기계어에 대응되는 어셈블리어가 바로 smali입니다

 

 

 

GitHub - RedAlien00/RedAlienShop: Vulnerable Android application for developers and security enthusiasts

Vulnerable Android application for developers and security enthusiasts - RedAlien00/RedAlienShop

github.com

 

GitHub - skylot/jadx: Dex to Java decompiler

Dex to Java decompiler. Contribute to skylot/jadx development by creating an account on GitHub.

github.com

smali 코드의 경우, JADX라는 도구에 APK파일을 업로드하여 확인할 수 있습니다
저는 제가 제작한 RedAlienShop을 업로드하였습니다

 

 

 

1. RedAlienshop - Application Debuggable 취약점

GitHub - RedAlien00/RedAlienShop: Vulnerable Android application for developers and security enthusiastsVulnerable Android application for developers and security enthusiasts - RedAlien00/RedAlienShopgithub.com 0. 용어 설명 및 선행 지식@ build.pro

redalien.tistory.com

JADX의 경우, 하드웨어 스마트폰 디바이스를 연결하면 디버깅을 통해 smali 코드의 흐름을 직접 확인할 수 있습니다
궁금하신 분은 제가 작성한 위의 포스트를 참고하길 바랍니다

 

 


 

 

5. 마치며

지금까지 Kotlin이 Java와 100% 호환되는 이유를 알아보았습니다


해당 글의 핵심은 "JavaByteCode로 컴파일되기 때문이다" 로 정말 간단하지만 이러한 핵심을 이해하기 위한 배경지식들을
같이 설명해보았습니다 이에 확장하여 Android까지도 묶어서 설명해보았습니다

 

감사합니다

반응형

붉은외계인의 성장 기록

코드부터 일상까지, 배움과 경험을 공유합니다

🔍
스크롤해서 더 보기

함께하는 구독자들

구독자 8명

최신 포스트