| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 안드로이드
- genarics
- NavHost
- 무선 페어링
- producestate
- 명령형 ui
- compose
- gradle jdk
- State
- 2989번
- Java
- derivedstateof
- bottomscaffold
- 선언형 ui
- 자바
- mutablestate
- android
- 선언형ui
- ktor-auth
- apollo3
- snapshotflow
- rememberupdatedstate
- 2022 KAKAO BLIND RECRUITMENT
- mutableStateOf
- 양과 늑대
- clean coder
- 2022 kakao blind
- remembercoroutinescope
- 명령형ui
- JCF
- Today
- Total
버미
[안드로이드] JDK, JRE, JVM 그리고 Gradle JDK 본문
안드로이드 프로젝트 세팅을 위해, Gradle 파일에 JDK를 설정하는 부분이 있다. 이번 글에서는 Gradle에 JDK가 왜 필요한지, 간단한 관련 개념과 함께 포스팅하여 남기고자 한다.
JVM
Java Virtual Machine 으로 자바의 핵심이다. .java 파일이 컴파일되어 생성된 .class 바이트코드를 실제로 실행하는 가상 머신이다.
JVM 내부에는 다음의 요소들이 존재한다.
- 클래스 로더 시스템
- 런타임 데이터 영역 (Heap, Stack, Method Area 등)
- 실행 엔진 (Interpreter, JIT 컴파일러)
자바 코드가 운영체제와 직접 연결되지 않고 실행할 수 있도록 해주는 엔진이다.
JRE
Java Runtime Environment 으로 JVM에 자바 표준 라이브러리와 런타임 환경을 더한 개념이다.
- JVM
- 표준 클래스 (java.lang, java.util 등)
- 실행에 필요한 런타임 라이브러리
JRE는 자바 프로그램을 실행하는데 필요한 최소 환경이며 컴파일이나 디버깅과 같은 개발 도구는 포함하지 않는다.
JDK
Java Development Kit 으로 JRE에 개발 도구까지 포함한 패키지다.
- JRE
- javac (컴파일러)
- jdb (디버거)
- javadoc 등 각종 개발 도구
자바 개발자는 결국 JDK 를 설치해서 개발과 실행을 모두 수행하게 된다.
네이티브 안드로이드 프로젝트에서 build Gradle 파일을 보면 아래와 같이 어떤 JDK를 지정해야하는 코드를 볼 수 있다.
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
...
}
먼저 이 설정은 실행 시점이 아닌 컴파일 시점에 사용된다.
JDK에 있는 개발도구인 javac나 kotlinc 컴파일러가 어떤 JVM 버전을 기준으로 코드를 해석하고, 어떤 바이트 코드를 만들어야 하는지 결정하는 설정이다.
compileOptions
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
...
}
자바 코드에 대한 설정이다.
sourceCompatibility
자바 소스 코드의 문법 기준이다. 어디까지의 Java 문법을 허용할 것인가를 정한다.
예를 들어,
- VERSION_8 : lambda 가능
- VERSION_17 : record, sealed class 등 가능
targetCompatibility
생성되는 .class 바이트코드의 JVM 버전이다.
이 클래스 파일은 최소 어떤 JVM 에서 실행 가능하도록 할 것인가를 정한다.
대부분의 경우, 문법과 실행 대상 JVM을 맞추기 때문에 sourceCompatibility 와 targetCompatibility는 동일하다.
여기서 궁금한 점은 굳이 이 둘을 따로 설정하도록 나눠놨다는 것이다.
찾아본 결과, 새로운 자바 문법을 사용하면서도 오래된 JVM 환경과의 호환성을 유지해야하는 경우를 지원하기 위해서다.
sourceCompatibility = 11, targetCompatibility = 8 와 같은 경우는 그나마 자주 사용되지만,
sourceCompatibility = 17, targetCompatibility = 11 와 같은 경우는 record나 sealed 문법을 사용할 수 없어서 잘 사용하지 않는다.
kotlinOptions
android {
kotlinOptions {
jvmTarget = "17"
}
...
}
위의 블럭은 코틀린 컴파일러 전용 옵션이다.
Kotlin은 JVM 바이트 코드로 컴파일되는데, 이 때 생성되는 .class 파일의 JVM 타겟 버전을 지정한다.
즉, 코틀린 코드가 최소 JVM 몇 버전 부터 이해할 수 있는 .class 파일 형식으로 컴파일할지 설정한다.
javac와 달리 kotlinc의 컴파일 옵션에는 source 버전을 별도로 지정할 필요가 없다.
이는 Kotlin의 언어 규칙이 컴파일 타임에 모두 처리·변환되어, 람다나 타입 추론과 같은 개념이 실행 시점(JVM)에는 남지 않도록 설계되었기 때문이다.
그 결과 JVM은 Kotlin 언어를 해석하지 않고, 최소한의 바이트코드 정보만을 기반으로 실행을 담당한다.
아래와 같이 코틀린 컴파일러의 버전을 Gradle 플러그인/의존성이 결정하기만 하면, source 버전을 자동으로 컴파일러의 버전으로 따라간다.
plugins {
kotlin("android") version "1.9.25"
}
지금까지 언급했던 내용은 빌드 결과물에 대한 버전 지정에 관한 내용이었다.
이제, Gradle JVM에 대해 알아보자.
Gradle JVM은 Gradle 이라는 빌드 도구 자체를 실행하는 JVM을 말한다.
Gradle은 Java/Kotlin으로 작성된 JVM 어플리케이션이다.
즉, 실행 자체가 JVM 없이는 불가능하다.
Gradle JVM은 다음을 실행한다:
- Gradle core
- build.gradle.kts (Kotlin DSL)
- Gradle plugin (AGP, Kotlin plugin 등)
- 각종 task 로직
- 테스트 JVM fork 관리
Gradle JVM 버전에 따라 컴파일에 직접적으로 영향을 주지는 않지만,
Kotlin plugin이 특정 JDK 이상 요구한다던지, AGP 8.x 이상은 그래들 JDK 가 최소 17 이상이어야 한다던지하는 간접적으로 영향을 미친다.
Gradle JVM 버전 설정은 Settings에서 Build Tools에서 Gradle JDK를 지정할 수 있다.
정리하면, Gradle JVM은 빌드 결과물의 JVM 버전을 의미하는 것이 아니라,
Gradle이라는 빌드 시스템 자체를 실행하는 JVM을 의미하며, 컴파일러와 타겟 JVM 설정과는 완전히 독립적인 개념이다.
'안드로이드' 카테고리의 다른 글
| [안드로이드] 웹뷰와 커스텀 탭 (0) | 2026.03.23 |
|---|---|
| [안드로이드] MVI에서 Event 처리: Channel vs SharedFlow (0) | 2025.12.22 |
| [안드로이드] 안드로이드 스튜디오 무선 연결이 안될 때 (0) | 2025.10.02 |
| [안드로이드] Gson과 kotlinx.serialization 차이 (0) | 2025.09.23 |
| [안드로이드] Gradle 이란 (0) | 2025.09.16 |