Rのつく財団入り口

ITエンジニア関連の様々な話題を書いているはずのブログです。

【感想】『速習 Kotlin Javaより簡単!新Android開発言語を今すぐマスター 速習シリーズ』:と、おすすめ Kotlin 本リスト

【感想】『速習 Kotlin Javaより簡単!新Android開発言語を今すぐマスター 速習シリーズ』と主要なKotlin本リスト

ことりん!

サンプルコードがすべてKotlinになっている『読みやすいコードのガイドライン』を読んでもうちょっとKotlinを知っておいた方がいいなと思ったので読みました。
 安心の山田祥寛さんの速習シリーズ。電子書籍限定ですが500円でいろんな言語や技術が手早く学べるお得なシリーズの1冊です。2018年とちょい古いので、KotlinのロゴもVisual Identityが更新される前のものですね。

blog.jetbrains.com

Part 1:イントロダクション

  • 登場が2011年、2017年から話題。JVM上で動くのでコンパイルするとjarファイルになり、Javaリソースも流用可能。
  • Javaコードよりずっと簡潔、Null安全と暗黙的なスマートキャストでの安全性、実はフロントエンドやデスクトップの動きもあり相互運用性に優れる、IntelliJ IDEAの開発元のJetBrains社ということでツールとの親和性が高い。
  • コマンドラインからの実行時もコマンドは kotlinソースコードの拡張子は.kt

 まずは基本から。話題になった時はフロントエンドのサポートの話もあったようですが、このへんはやはりその後は進まずに、Androidアプリ、バックエンドが主領域となったようです。

Part 2:基本構文

  • 変数宣言は var
  • 文末のセミコロン不要。
  • 型は num: Int のように後に書く。
  • 文字列リテラルは複数行のraw Stringも可能、文字を埋め込む文字列テンプレートもあり。
  • null非許容がデフォルト、型のあとに?をつけるとnullableに。
  • Javaで文字列比較のequalsメソッドでやっていた同値性は ==、オブジェクトの同一性が===
  • .? で非nullの時だけアクセスしなさい、とできる。
  • 暗黙的な型変換は厳しく、明示的にtoXxxx関数を呼ぶ。
  • 配列も各種。
  • 変数宣言で val とすると変更不可の定数。
  • それとは別に const valコンパイル時定数がある。

Kotlinはvarとval、JSはvarとletとconst、varだけの言語もあればletだけの言語もあり...とややこしいですね。基本的にnull非許容でぬるぽがない世界線に到達しています。

Part 3:演算子/制御構文

  • 三項演算子がない。
  • if (i in 1..20) のように範囲演算子がある。
  • ifが文でなく式。式の場合はelseが省略できない。
  • when で分岐。多彩な書き方ができる。書き方がRustと似ている。
  • is String のように型で判定できる。
  • for ((key, value) in list) のようにリストやマップの繰り返し処理。
  • breakで抜ける時のラベルは label@ のように表す。

このwhen式は便利ですね。ifが文でなく式である言語はモダンな言語だと多いのですが、なるほどそういう時代なのだなと思いました。

Part 4:関数

  • 関数は fun someFunc(str: String): String {...} 形式。
  • 関数の本体が一文なら省略形もあり、returnも省略できる。JavaScriptっぽい。
  • 引数の規定値、名前付き引数もあり便利。
  • (vararg vals: String) のようにして可変長引数もできる。
  • Pair<型, 型>Triple<型, 型, 型> を使うと戻り値で複数値が返せる。ただし乱用注意。
  • 高階関数として、関数の引数に関数を渡せる。引数に ::関数名 という不思議な書き方
  • 使い捨ての匿名関数(ラムダ式)があり、書き方をどんどん省略できる。JSのアロー関数的。
    list.foreach({ num: Int ->println(num)}) ==極限まで省略すると==> list.forEach{println(it)}

『読みやすいコードのガイドライン』を読んだときに関数の引数に ::関数名 を渡していたのが何だろうと思ったのですが、関数が中に入った変数を渡すのでなく、関数名で渡せるんですね。ラムダ式の書き方もJSライクに何種類か省略形があって面白いです。

Part 5:オブジェクト指向構文

  • class ClazzName() {} で、staticなメンバ変数はない。
  • アクセス修飾子はJavaと同じpublic/protected/privateの3つだが微妙に違い、+internal(同じモジュール単位で限定)の4つ。
  • 「プロパティ」といって、var age: Int の直後に set(value) {...} のように処理を書くと、user.age = 10 のようにアクセスしたときに処理が走ってくれる。見た目は変数だが生身はメソッド。
  • 「プライマリコンストラクター」は class Person constructor(name: String) { ...} のようにクラス定義に一緒に書く。
    実際の処理はその下の init{} ブロック。処理がない場合は、自動的に引数がプロパティになってくれる。関数と同じく規定値も指定できる。
  • 2つめ以降の「セカンダリコンストラクター」は、Javaのコンストラクタ宣言と同じようにクラス定義の中にconstructor(name:String, age: Int) {} のように書く。いくつでも作れる。
  • インポートはJavaと同様だが asエイリアスも指定可能、クラスだけでなく関数も可能。

C#もメンバ変数についてはプロパティと称してその後いろいろ進化しているのですが、Kotlinもこのへんいろいろ工夫されています。構造体と同じように person.age のようにドットでアクセスする時代なんですね。
コンストラクタをクラス宣言と同じところに書くのも独特な感じがしました。

Part 6:継承とインターフェイス

  • クラスはデフォルトで継承不可。open class ClassName として初めて継承可能。
  • キーワードは extends でなく :C#は元からこちらで最近の言語はたいていこれ。
  • メソッドのオーバーライドは通常の override
  • abstract で抽象クラス、抽象メソッド。
  • インターフェースもJavaと同じで、Java8から使えるようになったインターフェースのデフォルト実装(メソッド名の定義だけでなくメソッドの中身も定義する)が最初から可能。
  • Javaのインターフェースに持てるのは定数だけだったが、Kotlinではプロパティも定義できる。
  • 親クラスから子クラスへの型の変換は、スマートキャストで if (p is ParentClass) {} のように判定すれば、明示的なキャストは不要。Kotkinでは明示的なキャストがほぼ不要。(!)

「継承よりも委譲」、最近のWEB+DB PRESS誌でも特集でオブジェクト指向を振り返っていましたが、もはやオブジェクト指向が絶対正義ではない時代。クラスはふつうに作ると継承使わないんですねえ。キャストがほぼいらないというのもすごい。

Part 7:特殊なクラス

  • 「データクラス」として data class Article (val v1: String, v2: String...) のように定義すると、中身不要でもうデータの入れもの専用クラスが作れてしまう。equals, toStringメソッドが自動生成。
  • 同様に自動生成される conponentN メソッドといって、データクラスのインスタンスから受け側の複数の変数に一度に分割代入できちゃう。
  • object MyApp {...} のように「オブジェクト宣言」すると、常にインスタンスがひとつだけのSingletonパターンのクラスができてしまう。
  • ちなみにstaticなメソッドを集めただけのユーティリティクラスはJavaでは作るが、Kotlinの流儀では作らない。あるパッケージ配下のトップレベルの関数にする。近年の関数型指向の言語と同じ。
  • SAM: SIngle Abstract Method といって、ひとつしか抽象メソッドを持たないインターフェイスラムダ式で置き換えられ、どんどん省略できる。ボタン押下時に btn.setOnClickListner{ Log.v("logging!") } のように書いたり。省略すると ( でなく { になっている。
  • 「コンパニオンオブジェクト」を使うとstaticなメンバ変数の代わりができる。
  • enum が列挙型で、プロパティも持てる。
  • ジェネリック型の <T> もサポート。関数でも使える。
  • 不変/共変/反変 に関連して outin 修飾子がある。

書籍『良いコード/悪いコードで学ぶ設計入門』ではデータクラスis悪という論調で書かれていますが、Kotlinではこういうデータの入れ物専用クラスというのも工夫されています。メンバ変数がずらーっと並んでsetter/getterメソッドがずらーっと並んだだけのクラス、Javaではさんざん見てきましたからね...
1ファイルの中にクラスでなく関数だけでも書けて、Mainクラス内の public static void main(... メソッドでなく関数を書くだけから処理を開始できるのもインタープリタ型言語的です。変遷あってもう世の流れはこちらなんだなあと思いました。

Part 8:もっとオブジェクト指向

  • fun Sring.extraFunc(num: Int): String { } のようにするのが拡張関数で、継承を使わずとも既存のクラスにメソッドを追加できる。
  • + なら plus のように、対応する関数をオーバーライドすることで演算子自体のオーバーライドもできる。
  • クラスの中にクラスを書く入れ子のクラスも可能。内側に inner 修飾子をつけるとインナークラスとなり、外側からアクセスできる。
  • プロパティに変更があったら通知するような、委譲プロパティがありObservableになる。Androidアプリ向けか。
  • クラス内のプロパティに変数を宣言する時に by lazy をつけると、二回目以降は初回生成時の値を返す「遅延プロパティ」がある。
  • インターフェイスの実装を他のクラスにゆだねる「委譲クラス」というものもある。

拡張関数というのがなんかJSのprototype拡張っぽい! 演算子をオーバーライドできるというのも凄いです。

まとめ:短時間でKotlinの概要がわかる本

 「速習」の名の通り、スッと確認できてお値段も500円、オトクな本でした。
 KotlinについてはJavaScriptっぽいところもあり、インタープリタ型言語全般に通じた手軽なところもあり、GoやRustに似ているところもあり、未確認ですがきっとSwiftにも似たところがあるのでしょう、その一方でKotlin独特なところもあり、モダンな言語はいろいろ工夫されているのだなと改めて思いました。

おまけ 主要なKotlin本リスト

 日本語で読める商業本でAmazonで買える主要な本を調べて新しい順に並べてみました。  

『TECHNICAL MASTER はじめてのAndroidアプリ開発 Kotlin編』2021/11で最新。こちらはAndroidに特化して、Android Studio上でのKotlinでのアプリ実装を一通り解説しています。

『Kotlin サーバーサイドプログラミング実践開発』2021/4でWebアプリ系ではほぼ最新。Kotlinの基本のほかWebアプリのFWはSpringBoot、後半でKtorも紹介、他のKotlin製ライブラリも紹介と一通り揃っています。

『基礎からわかる Kotlin』2021/5で同時期。WebアプリのFWはKtorを扱っています。こちらも良さそうな本なのですが、Amazonの評価がえらく低いですね。

基礎からわかる Kotlin

基礎からわかる Kotlin

Amazon

『Kotlinハンズオン』2021/5。様々な言語での初心者向けハンズオン本を出している掌田 津耶乃さんのシリーズ。他言語での同シリーズみなそうなのですが、エンジニアが本格的に入門するには浅めでしょうか。Amazonの評価も低めですね。

プログラマーにおくるKotlin流し読み入門: Androidアプリ開発の新言語をスピードマスター』2020/2Kindle本しかありませんが650円で114ページ、サッと概要が流し読みできる本です。

『みんなのKotlin 現場で役立つ最新ノウハウ! 』2020/1。最近(2023年)この「みんなの~」シリーズのムック本をあまり見かけないのですが、それのKotlin版。144ページと薄めですが、様々なトピックが詰まった本になっています。

そして2019年、Androidアプリの推奨言語が正式にKotlinと発表されます。

『Kotlinプログラミング』2019/2、海外の翻訳本。400ページ以上の本格的な本。海外本特有のとっつきにくさは若干あるようです。

『やさしいKotlin入門』2018/10Javaも分からない人もターゲットに入れて前半はしっかり解説していているようです。電子書籍がないのが痛いですね。

この2017年にAndroidがKotlin正式サポート開始。2017/10にAndroid Studio 3がAndroidサポートを開始して開発環境も整います。

洋書からの翻訳でよくある~イン・アクションのシリーズ『Kotlinイン・アクション』はソフトカバー単行本のみでなんと1万円以上! 2017/10なのでもう古いでしょうか。

『Kotlin Webアプリケーション 新しいサーバサイドプログラミング』2017/10、下の“赤ペコ本”の続編的に、後半はWebアプリFWはSpring Bootを扱っています。この2017年頃にAndroidアプリの開発言語ラインナップにJavaの他にKotlinも加わっています。

『Kotlinスタートブック -新しいAndroidプログラミング』2016/7。Kotlinの名前が広がった頃に話題になった“赤ペコ本”です。

他、技術同人誌発の技術の泉シリーズが

と3冊出ています。(うち2冊は以前Podcastのaozora.fmに出演させていただいたFORTEさんの本だ!)

またAndroidアプリ開発本の範疇ですが、

  • 『作ればわかる! Androidプログラミング Kotlin対応 10の実践サンプルで学ぶAndroidアプリ開発入門』2019/6
  • 『基礎&応用力をしっかり育成! Androidアプリ開発の教科書 第2版 Kotlin対応 なんちゃって開発者にならないための実践ハンズオン』2021/4
  • 『作って楽しむプログラミング Androidアプリ超入門 改訂新版』2021/11

この3冊が明確にKotlinに対応しています。

 並べて11+3+3=17冊。Javaの後継言語ということもあり、他のプログラム言語を扱った本と並べると冊数はやや少な目ですね。2021年が最新で2022年以降は新刊が出ていません。
 またKotlin本ではカバーされていない領域もあるので、必要に応じて上のようにAndroid自体の本、WebフレームワークならSpring(あるいはSpring Boot)の本も併用する形でしょうか。