Kotlinとはどんな言語なのでしょうか。
Javaに戻れなくなるって本当?
この記事では、Kotlinプログラミング言語の基礎から応用まで、詳しく説明します。
Kotlinプログラミング言語
Kotlinとは
Kotlinは、JetBrainsによって開発された静的型付けのプログラミング言語です。
Java Virtual Machine(JVM)で動作するため、Javaとの互換性があります。
Kotlinは、2011年に最初にリリースされ、2017年にはGoogleが「Androidの公式開発言語」としてKotlinを採用しました。
Kotlinは、Javaと比較して、より簡潔で読みやすく、コードの行数が少なくてすみます。
また、nullポインターエクセプション(NullPointerException)の問題を解決するために、null安全性を提供しています。
KotlinとJavaの違い
KotlinとJavaはどちらもJVM上で実行されるため非常に似ていますが、いくつかの違いがあります。
Kotlinは、Javaと比べてより短いコードで同じ機能を実現できるため、開発時間が短縮されます。
そのため、結果的にJavaよりも簡潔で読み易いコードになることが多いです。
また、Kotlinはnull安全性を提供しており、NullPointerExceptionが発生するようなコードが記述しにくい仕様になっています。(通常そのようなコードはコンパイルエラーになります)
さらに、Kotlinは関数型プログラミングの機能をサポート(関数を第1級オブジェクトとして扱える)しているため、より高度なプログラムを書くことができます。
(関数型に関してはJavaとScalaの中間といったイメージでしょうか)
Kotlinプログラミング言語のメリット
Kotlin言語には以下のようなメリットがあります。
簡潔で読みやすいコード
Kotlinは、Javaよりも簡潔で読みやすいコードを書くことができます。
Kotlinの構文は、より簡潔であるため、同じ機能を実現するために必要なコードの行数が少なくてすみます。
Null安全性
Kotlinは、null安全性を提供しており、NullPointerExceptionの問題を解決しています。
それでは、具体的にどのように解決しているのでしょうか。
KotlinはJavaと同じく静的型付け言語であり、プログラム中で扱うデータは厳密に型付けされます。
Javaでは例えば文字列を表すデータ型としてString型があります。
変数の宣言は次のようなコードになります。
String letter = “A”;
また、値が決まっていない(null)の変数宣言は次のようなコードになります。
String letter = null;
Javaではどちらのコードでも正常にコンパイルができます。
一方、Kotlinではどうなるでしょうか。先ほどと同じ例を使うと次のようなコードになります。
val letter: String = “A”
val letter: String = null
これで上手くいくような気がしますが、残念ながらKotlinではnullで初期化したコードがコンパイルエラーになります。
なぜコンパイルエラーになるのでしょうか。
実はKotlinではNullも格納できる型とNullは格納できない型を厳密に区別しています。
つまり、null許容型とnull非許容型という型が存在します。
先ほどの例の2つ目のコードでコンパイルが通るようにすると次のようなコードになります。
val letter: String? = null
Stringの後ろに?がつきました。Kotlinでは型の後ろに?を付与するとその型はnull許容型として扱われます。
つまりnull許容型で宣言された変数へはnullを代入することができます。
一方で?が付いていない型はnull非許容型として扱われ、nullを代入することができません。(コンパイルエラー)
これまで見てきたように、KotlinにおけるNull安全性とはNullの存在有無を型で区別し、違反していたらコンパイルエラーにするといった仕組みを取り入れることでNullPointerExceptionの問題を解決しています。
この仕組みのおかげでプログラマーはNullPointerExceptionが発生する可能性をコンパイルエラーという形で事前に把握することが可能になります。
これにより、開発者はより安全なコードを書くことができます。
Kotlinプログラミングの基本
Kotlinプログラミングの基本は、データ型、変数、制御構造、関数、クラス、オブジェクト、例外処理などです。
この辺りの機能はJavaとそれほど変わりません。
しかし、Javaと比べて表現力が高いのでコード量はかなり削減できます。
データ型と変数
Kotlinでは、Javaと同様に整数、浮動小数点数、文字、真偽値などの基本的なデータ型がサポートされています。
データ型でJavaと違うところはKotlinにはプリミティブ型がありません。
そのためコード上にプリミティブ型とプリミティブラッパークラスが混在するといったことがありません。
Kotlinは、型推論を自動的に行うため、変数の型を明示的に宣言する必要がありません。
変数の型宣言を省略できるのでコードがスッキリ見やすくなります。
制御構造と関数
Kotlinでは、if、when、for、whileなどの制御構造がサポートされています。
特筆する点としてはJavaと異なりKotlinのif、when、try-catchは構文ではなく、式として扱われます。
つまり値を返すことができます。
また、Kotlinは関数型プログラミングの機能をサポートしているため、高階関数やラムダ式を使用することができます。
JavaのようにFunctionalインターフェース(Consumer、Function)などを覚える必要はありません。
Kotlinでは非常にシンプルに表現することができます。
// 関数型変数の宣言(Int型を受け取りString型を返す関数)
val f: (Int) -> String
クラスとオブジェクト
Kotlinは、オブジェクト指向プログラミングの機能をサポートしています。
この辺りはJavaで提供されてる機能は網羅しています。
また、Javaではよくデータを保持するオブジェクト(いわゆるDTOなど)を作成する時にLombokを使ってgetter/setterの記述を省略しますが、KotlinではLombokを使わなくてもフィールドのみ宣言するだけでDTOオブジェクトを作成することができます。(裏側でバッキングフィールドが作成されます)
そのためKotlinではLombokを導入する必要はありません。
例外処理
Kotlinでは、Javaと同様に例外処理がサポートされています。
Javaと違うところはKotlinではチェック例外がありません。
そのため、try-catchを強要されたり、メソッドに「throws Exception」を付与する必要もありません。
Kotlinの特徴まとめ
Kotlinは、Javaと比較して、より簡潔で読みやすく、コードの行数が少なくてすみます。
また、Kotlinはnull安全性を提供しているため、NullPointerExceptionの問題を解決しています。
さらに、Kotlinは関数型プログラミングの機能をサポートしていてかつ簡潔にコードが記述できるため、より高度なプログラムが書きやすくなっています。
Kotlinプログラミングの書籍
最後にKotlinを学習する上で参考になった書籍をご紹介します。
Kotlinイン・アクション
Kotlin開発元であるJetBrainsの中の人が書いています。
Kotlinの書籍は他にも読んでみましたが、言語の解説としてはこの本が一番だと思っています。
廃盤になってしまい、少し高いですが他に決定版といった書籍がないので無くなる前に購入することをオススメします。
時折、Javaのコードも例に出しながらKotlinのコードとの違いを比較しながら丁寧に解説しています。
Java言語で開発したことがある人であればまずはこの本。
少し古い(Kotlinのversion 1.0)ですがKotlin言語の重要な部分はこの1冊で学べます。
Kotlinスタートブック
Java言語は知らないけど、Kotlinの魅力を知りたい、あるいは使ってみたいという人にはこの本がおすすめ。
読んでいるうちにKotlinでコードが書きたくてウズウズしてしまう、そんな1冊です。
Kotlinの魅力が満載です。
Kotlin サーバーサイドプログラミング実践開発
Kotlinを使って少し本格的なサーバーサイドアプリケーションを作りたい人であれば絶対にこの本。
これから本格的にKotlinを使って開発していきたいと考えている人には特におすすめです。
SpringBootを使って解説しているのでこの1冊でKotlin+SpringBootの基本が学べるまさに一石二鳥な1冊。