Javaの後継・Android公式言語・モダン簡潔・null安全・Coroutines
15年動いたモダンJVM。Javaの冗長さを解消し、Android公式となった
Kotlin は 2011年 に JetBrains(IntelliJ IDEA の開発元)が公開した静的型付け言語で、JVM・Android・JS・Native(LLVM)のマルチプラットフォーム対応が最大の特徴。Android は 2017年のGoogle I/O で「Kotlin 公式言語」化、2019年に「Kotlin-first」を宣言し、Google が Android 開発で Kotlin を推奨する立場が公式化している。
言語設計は Java の上位互換 を意図し、val/var・Null安全(String? vs String)・data class`data class User(val name: String)` と書くと **equals / hashCode / toString / copy / componentN が自動生成**されるクラス。DTO・ボイラープレート削減に絶大な効果・拡張関数・CoroutinesKotlin 標準の**軽量スレッド**機構。`suspend fun` による中断・`launch`/`async` による起動・構造化並行性で OS スレッドを占有せず数万単位の並行処理を実現(軽量スレッド)・when式・sealed class継承階層を**同ファイル内に限定**する abstract クラス。when 式と組み合わせると**網羅性チェック**が効き、Android の UI State 等の有限状態モデルで多用される などを導入して Java の冗長さを解消した。Java 資産(ライブラリ・JVM ツール)は全てそのまま呼べるため、Spring Boot・Hibernate 等を Kotlin から活用する事例が急増している。
2024年に Kotlin 2.0 がリリースされ、K2 コンパイラKotlin 2.0 で**デフォルト安定化**した新しいコンパイラフロントエンド。コンパイル速度・IDE 性能が大幅向上。言語機能の統一的な解析基盤 が安定版に到達してコンパイル速度・IDE 性能が大幅向上した。Compose Multiplatform で Desktop・iOS の UI も Kotlin で書けるようになり、サーバーサイド・モバイル・デスクトップの言語統一が現実的な選択肢になりつつある。
Androidアプリ(現行公式):Google 公式推奨の Android 開発言語。**Jetpack Compose**(宣言的 UI)・**Coroutines**(非同期)・**ViewModel/LiveData** 等を Kotlin で書くのが標準。Android 開発新規プロジェクトのデファクト。
サーバーサイド(Ktor / Spring Boot):**Ktor**(JetBrains 製・軽量 Web フレームワーク)または **Spring Boot**(Java 資産をそのまま活用)で REST API・マイクロサービスを Kotlin で実装。**Coroutines** で非同期処理が直感的に書ける。
Kotlin Multiplatform(iOS / JS / Desktop 共有コード):**KMP** で iOS・Android・Web(JVM/JS)・Desktop の**共通ロジック**を Kotlin 単一コードで共有。UI は各プラットフォームネイティブ、共通処理(API・データ層)は Kotlin で書いて工数削減。
CLI / ツール(Kotlin Script):`kotlinc -script` で **Kotlin Script**(`.kts`)を実行可能。Gradle の `build.gradle.kts` も Kotlin DSL で書かれ、ビルドスクリプト・運用ツール・データ処理スクリプトとしても活用。
data class を多用する業務システム:DTO・値オブジェクトを `data class` で**自動生成**(equals/hashCode/toString/copy)。JSON シリアライズは **kotlinx.serialization** で簡潔。Java と比べてボイラープレートが激減する。
| 観点 | Kotlin | Java | Scala |
|---|---|---|---|
| 言語の歴史 | 15年(2011-)・JetBrains製・Java後継 | 31年(1995-)・JVMの原点 | 22年(2004-)・関数型JVM |
| Java 互換・相互運用 | 完全(Java ライブラリを直接呼べる・混在可能) | 完全(基準) | 完全(Java 資産活用可) |
| Null安全(コンパイル時検出) | あり(`String?` vs `String` で型で区別) | なし(NullPointerException の温床) | Scala 3 で改善(Option 型中心) |
| Android 対応 | 対応(現行公式・Kotlin-first) | 対応(既存資産は依然主流) | 非対応(実質) |
| 学習コスト | 中(Java 経験者は習得しやすい) | 高(記法冗長・25年蓄積の概念) | 高(関数型・ implicit・型理論が難しい) |
| 関数型プログラミング | 対応(不変 val・高階関数・関数参照) | 限定的(Stream API・ラムダ) | 対応(本流・For 内包表記・モナド指向) |
| Coroutines(非同期) | **言語標準**(`suspend fun`・構造化並行性) | 限定的(CompletableFuture・Virtual Threads) | 非標準(ライブラリ依存) |
| 向いている場面 | Android・モダンJVM・KMP・サーバーサイド新規 | 大規模基幹・既存資産保守・JVM資産 | ビッグデータ(Spark)・DSL・関数型重視 |
選ぶ理由:
Java の上位互換として設計され、既存の Java ライブラリ・フレームワーク(Spring・Hibernate 等)をそのまま呼べる。Null安全(コンパイル時に NullPointerException を検出)・data class(equals/hashCode/toString 自動生成)・拡張関数(既存クラスの拡張)・Coroutines(軽量スレッド・構造化並行性)・when式(スマートキャスト付きのパターンマッチ)など、モダン言語機能を後付けなしで備えている。Android の現行公式言語(Kotlin-first)で、Jetpack Compose・KMP(iOS/Desktop 共有)と組み合わせればモバイル・サーバー・デスクトップを単一言語で統一できる。K2 コンパイラ(Kotlin 2.0)でビルド速度も改善済み。
選ばない理由:
ビルドツール Gradle の重さが依然課題(特に Android プロジェクトで初回ビルドが数分)。学習コストは中だが、Java に無い概念(拡張関数・スコープ関数・sealed class・inline reified 等)が複数あり、Java も Kotlin も読めないメンバーには導入コストがかかる。Kotlin 固有機能(拡張関数・演算子オーバーロード・DSL)を多用すると Java 側から見ると読みづらくなる(相互運用時の注意)。コンパイル時間が Java より長いケースがあり、大規模プロジェクトの CI 高速化では課題。
パッケージマネージャ:Gradle(標準・Kotlin DSL `build.gradle.kts` または Groovy DSL `build.gradle`)
主要フレームワーク:
主要ライブラリ:
ランタイム:
Hello World(fun main)
// Kotlin 1.3 以降は main もクラス不要・fun のみ
fun main() {
println("Hello, Kotlin!")
}
data class(equals/hashCode/toString 自動生成)
// data class 宣言だけで equals/hashCode/toString/copy/componentN が自動生成
data class User(
val id: Long,
val name: String,
val email: String,
)
val alice = User(1, "Alice", "alice@example.com")
val bob = alice.copy(name = "Bob") // 一部だけ変更してコピー
val (id, name, _) = bob // 分解宣言(destructuring)
println(bob) // User(id=1, name=Bob, email=alice@example.com)
Coroutines(suspend fun + launch/async)
import kotlinx.coroutines.*
// suspend fun = 中断可能な関数(Coroutine 内で呼ぶ)
suspend fun fetchUser(id: Long): String {
delay(100) // 非ブロッキング待機(OS スレッドを占有しない)
return "User-$id"
}
fun main() = runBlocking { // main も Coroutine として動かす
// launch: 結果を返さない並行処理
val job = launch {
val name = fetchUser(42)
println("got: $name")
}
// async: 結果を返す並行処理(await で取り出す)
val deferred = async { fetchUser(99) }
println("parallel: ${deferred.await()}")
job.join()
}
Null安全(`String?` vs `String`)
fun greet(name: String?): String { // String? = null 許容
// ?. (セーフコール): null なら全体も null
// ?: (エルビス演算子): null なら右辺を返す
return "Hello, ${name?.uppercase() ?: "World"}!"
}
fun main() {
println(greet("Kotlin")) // Hello, KOTLIN!
println(greet(null)) // Hello, World!
// val s: String = null // ← コンパイルエラー(String は非 null)
// val s: String? = null // ← OK(String? は null 許容)
}
Extension function(既存クラスの拡張)
// String に isEmailValid() を後付け(既存クラスを変更せずに拡張)
fun String.isEmailValid(): Boolean =
this.contains("@") && this.contains(".")
// List<Int> に第二要素取得拡張
fun <T> List<T>.secondOrNull(): T? = if (size >= 2) this[1] else null
fun main() {
println("alice@example.com".isEmailValid()) // true
println("alice.example.com".isEmailValid()) // false
println(listOf(1, 2, 3).secondOrNull()) // 2
}
初級(目安: 〜1-2週間(Java 経験者は更に短縮))
中級(目安: 〜1-2ヶ月)
上級(目安: 〜2-4ヶ月)