Kotlin JVM(Kotlin/JVM)とは、Kotlinで書かれたプログラムを Java Virtual Machine(JVM)上で実行するためのコンパイルターゲットです。
Kotlinはマルチプラットフォーム言語であり、主に次のようなターゲットがあります。
| ターゲット | 用途 |
|---|---|
| Kotlin/JVM | サーバー・Android・CLI |
| Kotlin/JS | Webフロントエンド |
| Kotlin/Native | ネイティブアプリ |
| Kotlin Multiplatform | 複数プラットフォーム共有コード |
この中でも Kotlin/JVMは最も利用されている実行形態です。
Kotlin/JVMでは、Kotlinコードはコンパイルされると Java互換のバイトコード(.class) に変換され、JVM上で実行されます。
Kotlin JVMのコンパイルと実行の仕組み
Kotlin/JVMの基本的なコンパイルフローは次の通りです。
Kotlin source (.kt)
↓
Kotlin Compiler
↓
JVM Bytecode (.class)
↓
Java Virtual Machine
↓
実行
つまり、Kotlin/JVMは JVMエコシステムの一部として動作する言語です。
そのため、
- Javaライブラリ
- Javaフレームワーク
- JVMツール
などをそのまま利用できます。
Javaとの相互運用性
Kotlinは Javaとの高い相互運用性(Interoperability) を持つよう設計されています。
これは「完全互換」という意味ではなく、JavaコードとKotlinコードを同一プロジェクト内で混在させて利用できるという意味です。
例えばKotlinからJavaクラスを呼び出すことができます。
val list = java.util.ArrayList<String>()
list.add("Hello")
逆に、JavaからKotlinコードを呼ぶことも可能です。
Kotlinファイル
fun greet(name: String): String {
return "Hello $name"
}
Javaコード
String message = HelloKt.greet("Taro");
Kotlinのトップレベル関数は通常、ファイル名ベースのクラス(例: HelloKt)としてJava側から見えます。
KotlinのNull安全(Null Safety)
Javaでは次のような例で発生する
NullPointerException
が非常に多い問題でした。
String name = null;
name.length(); // NPE
Kotlinでは 型システムにnull安全の概念が組み込まれています。
var name: String? = null
? が付いた型は nullable型です。
name?.length
このように書くことで安全にアクセスできます。
ただし重要な点として、KotlinでもNPEが完全に排除されるわけではありません。
以下のようなケースではNPEが起こり得ます。
!!演算子の使用- Javaコードとの相互運用
- 初期化の問題
したがってKotlinはNPEを減らす仕組みを持つ言語と理解するのが正確です。
Data Class
Kotlinではデータ保持用のクラスを簡潔に記述できます。
data class User(
val name: String,
val age: Int
)
data classでは主に次のメンバーが自動生成されます。
- equals()
- hashCode()
- toString()
- componentN()
- copy()
またプロパティに応じてgetterが生成されます。
setterは var の場合のみ生成されます。
この仕組みにより、Javaよりもボイラープレートコードを減らしやすくなります。
拡張関数(Extension Function)
Kotlinでは既存のクラスに対してメソッドを追加したように書ける構文があります。
fun String.addHello(): String {
return "Hello $this"
}
使用例
println("Kotlin".addHello())
ただし重要な点として、拡張関数は実際にクラスを変更しているわけではありません。
コンパイル時に静的関数として解決される仕組みです。
Kotlinの非同期処理(コルーチン)
Kotlinでは コルーチン(Coroutine) によって非同期処理を簡潔に書くことができます。
代表的な例
suspend fun fetchData(): String {
delay(1000)
return "data"
}
呼び出し
runBlocking {
val data = fetchData()
println(data)
}
ただし delay や runBlocking などはKotlin言語コアではなく、主に kotlinx.coroutinesライブラリ によって提供されています。
コルーチンは次の用途でよく使われます。
- 非同期I/O
- 並列処理
- ネットワーク処理
Kotlin JVMが使われる主な分野
サーバーサイド開発
KotlinはJavaフレームワークと組み合わせて使用されます。
代表例
- Spring Boot
- Ktor
Web APIやマイクロサービス開発に使われることが多いです。
Androidアプリ開発
AndroidではKotlinが 推奨言語(Kotlin-first) とされています。
主な開発環境
- Android Studio
- Android
Androidでのビルドフローは次のようになります。
Kotlin source
↓
JVM bytecode
↓
DEX bytecode
↓
Android Runtime (ART)
つまり、Kotlinコードは最終的に DEX形式に変換されてART上で実行されます。
Kotlin JVMのメリット
Java資産を活用できる
JVMエコシステムのライブラリをそのまま利用できます。
例
- Spring
- Hibernate
- Jackson
- Apache Commons
記述量を減らしやすい
Kotlinは
- data class
- null safety
- type inference
- extension function
などにより、Javaより簡潔なコードを書きやすい特徴があります。
モダンな言語設計
Kotlinは次のパラダイムを組み合わせています。
- オブジェクト指向
- 関数型プログラミング
- DSL設計
Kotlin JVMの制約
JVMに依存する
Kotlin/JVMは
- JVM上で動作
- ネイティブ実行ではない
という特徴があります。
ただしKotlinには他にも
- Kotlin/Native
- Kotlin/JS
などのターゲットがあります。
Kotlin JVMの開発環境
主なIDE
- IntelliJ IDEA
- Android Studio
主なビルドツール
- Gradle
- Apache Maven
Gradle例
plugins {
kotlin("jvm") version "2.x.x"
}
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib"))
}
まとめ
Kotlin/JVMとはKotlinコードをJVMバイトコードにコンパイルし、JVM上で実行する仕組みです。
主な特徴は次の通りです。
- Javaとの高い相互運用性
- null安全
- data class
- 拡張関数
- コルーチン
これらの特徴により、Kotlin/JVMは現在
- Androidアプリ開発
- サーバーサイド開発
- CLIツール
などで広く利用されています。
以上、Kotlin JVMについてでした。
最後までお読みいただき、ありがとうございました。










