こんにちは、かつコーチです。
「JVM(Java仮想マシン。Javaのコードを様々な環境で動かすための実行基盤)で動く言語なら、KotlinとJavaはどう違うのか」
Java学習が一段落した中級者の方から、よく聞かれる質問です。
KotlinはNull安全(変数がnullになり得るかどうかを型で区別し、コンパイル時にNullPointerExceptionの原因を防ぐ仕組み)を言語仕様に組み込んだ、JetBrains社が開発した言語で、Android開発の公式言語にも採用されています。
この記事では、文法の違い、用途の違い、学習コストの3つの軸でJavaとKotlinを比較検証します。
読み終える頃には、自分の目的に合った言語をはっきり選べるようになります。
文法の違いを比較する
同じ処理を書き比べてみる
まずは「nullかもしれない名前を安全に扱う」という同じ処理を、両言語で書いてみます。
// Java
String name = getName(); // nullの可能性がある
String greeting = (name != null) ? "こんにちは、" + name + "さん" : "こんにちは、ゲストさん";
// Kotlin
val name: String? = getName() // nullを許容する型を明示
val greeting = name?.let { "こんにちは、${it}さん" } ?: "こんにちは、ゲストさん"
Javaはnullチェックを自分で書く必要があり、書き忘れるとNullPointerExceptionが実行時に発生します。
KotlinはString?のように型自体に「nullを許容するかどうか」を明示するため、コンパイラがnullチェック漏れを検出してくれます。
この違いは、後述する設計思想の違いをそのまま反映しています。
文法面の比較表
| 項目 | Java | Kotlin |
|---|---|---|
| null安全性 | 型では区別されない(実行時にNPEが発生し得る) | 型で区別する(StringとString?) |
| データクラス | record(Java16以降)で簡潔に書ける | data classで同等の機能+αを提供 |
| セミコロン | 必須 | 省略可能 |
| 変数宣言 | var(可変)のみ、不変にはfinal修飾子 | val(不変)とvar(可変)を使い分け |
| 拡張関数 | 存在しない(ユーティリティクラスで代替) | 既存クラスにメソッドを後から追加できる |
Javaは「明示的で読み手に迷いがない」ことを重視する言語です。
Kotlinは「簡潔に書けて、かつ安全性も高める」ことを重視する言語です。
どちらが優れているというより、JVM言語として何を優先するかが違うと理解するのが正確です。
用途の違いを比較する
Android開発はKotlinが公式言語
Android開発の分野では、2019年にGoogleがKotlinをAndroid開発の優先言語として発表して以降、新規プロジェクトの多くがKotlinを採用しています。
Jetpack Compose(Android用の宣言的UIフレームワーク)もKotlin前提で設計されており、最新のAndroid開発ノウハウはKotlin中心に蓄積されています。
Javaでも引き続きAndroid開発は可能ですが、公式ドキュメントやサンプルコードのKotlin比率は年々高まっています。
サーバーサイド開発はJavaの資産が厚い
サーバーサイド開発の分野では、Spring Bootを中心にJavaのエコシステムが長年蓄積されており、求人数・情報量ともにJavaが優位です。
KotlinもSpring Bootに公式対応しており、既存のJava資産(ライブラリ・社内フレームワーク)をそのまま呼び出せる相互運用性(異なる言語同士がシームレスに連携できる性質)の高さが特徴です。
筆者の肌感覚では、既存のJavaプロジェクトに途中からKotlinを部分導入するケースは増えていますが、新規のサーバーサイド案件でゼロからKotlinを選ぶ現場はまだJavaほど多くない印象です。
用途別の比較表
| 用途 | Java | Kotlin |
|---|---|---|
| Androidアプリ開発 | 可能だが情報量は減少傾向 | 公式言語として優位 |
| サーバーサイド(Spring Boot) | 資産・求人ともに豊富 | 対応済みだが採用事例はJavaより少ない |
| 大規模レガシーシステムの保守 | 圧倒的に多い | 少ない(新しい言語のため) |
| 学習教材・日本語情報の量 | 非常に多い | 増加中だがJavaにはまだ及ばない |
学習コストを比較する
最初の壁:Null安全の記法に慣れる
Kotlin未経験のJavaエンジニアがまずつまずくのは、?や!!といったnull安全のための記法です。
Kotlin: Type mismatch: inferred type is String? but String was expected
Javaにはない概念のため、最初は「なぜここに?を付ける必要があるのか」で立ち止まりやすいところです。
一方Javaは、NullPointerException(通称NPE)そのものが初心者にとって長年の壁になってきました。
Exception in thread "main" java.lang.NullPointerException:
Cannot invoke "String.length()" because "name" is null
筆者自身、Kotlinを学び始めた頃は!!(非null表明。nullではないとコンパイラに強制的に伝える記法)を安易に使ってしまい、結局NPEを起こしたことがあります。
「Kotlinを使えばNPEが起きない」わけではなく、「NPEが起きやすい箇所をコンパイラが指摘してくれる」だけだと理解しておく必要があります。
学習の続けやすさ
JavaからKotlinへの移行は、他の言語ペアと比べて学習コストが低い部類に入ります。
同じJVM上で動作し、クラス・interface・継承といったオブジェクト指向の概念がほぼ共通しているためです。
逆にKotlinから先に学んだ場合、Javaの冗長な記法(getter/setterの手書き、finalの明示等)に戸惑うことがあります。
JavaのrecordはKotlinのdata classを参考に設計された機能で、両言語は互いに影響を与え合いながら進化してきた経緯もあります。
学習コストの比較表
| 項目 | Java | Kotlin |
|---|---|---|
| 最初の壁 | NullPointerExceptionとの格闘 | null安全の記法(?・!!・let)に慣れる |
| 書き方の自由度 | 低め(記法が統一されやすい) | 高め(省略記法・拡張関数など表現の幅が広い) |
| Javaエンジニアの移行難度 | – | 低い(概念の多くが共通) |
| 学習教材・日本語情報の量 | 非常に多い | 増加中 |
どちらを選ぶべきか
目的別の判断基準
- Android開発に進みたい → Kotlin(公式言語で情報量も最新)
- 大規模なレガシーシステムの保守案件に関わりたい → Java(圧倒的に案件数が多い)
- Spring Bootでの新規サーバーサイド開発、かつnull安全を重視したい → Kotlin(Spring公式対応済み)
- 求人数・教材の豊富さを重視して学習を進めたい → Java
- すでにJavaの基礎がある → まずJavaを固めてからKotlinに応用展開するのが効率的
「どちらか一方しか学べない」わけではなく、JVM言語という共通基盤があるため、Javaの基礎はKotlin学習にもそのまま活きます。
まとめ
この記事のポイント
- Javaは明示的な記法、Kotlinはnull安全と簡潔さを重視する設計思想
- Android開発はKotlinが公式言語、サーバーサイドはJavaの資産がまだ厚い
- Kotlinのnull安全は「NPEを防ぐ仕組み」であって「NPEが絶対に起きない」わけではない
- JavaエンジニアからKotlinへの移行は、オブジェクト指向の概念が共通しているため比較的スムーズ
次に読むべき記事
- record(Java21)でシンプルにデータを表現するの記事へ
- Optionalでnullを安全に扱うの記事へ
- JavaとPythonの比較検証(初心者向け)の記事へ
タグ: Java, 中級者向け, 比較検証