Kotlin JVMについて

採用はこちら

Kotlin JVM(Kotlin/JVM)とは、Kotlinで書かれたプログラムを Java Virtual Machine(JVM)上で実行するためのコンパイルターゲットです。

Kotlinはマルチプラットフォーム言語であり、主に次のようなターゲットがあります。

ターゲット用途
Kotlin/JVMサーバー・Android・CLI
Kotlin/JSWebフロントエンド
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)
}

ただし delayrunBlocking などは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についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次