Android 向け Kotlin 入門(基本文法編)
今回は Android アプリ開発で必要となる Kotlin 言語について説明します。
Java から Kotlin へ
Android アプリは Java で開発していました。しかし 2017 年の Google I/O で Kotlin が公式の開発言語となり、 2019 年の Google I/O で、「Kotlin First」という方針が示されました。今後、Android アプリの サンプルやドキュメントは Kotlin となり、Kotlin でしか利用できない機能(例えばコルーチン)も 積極的に使われるようです。このような流れの中、新規アプリ開発を Java で学ぶのは得策ではありません。 これからアプリ開発を学ぶ人は、Java ではなく Kotlin で学ぶようにしましょう。
ここからは Kotlin の基本文法について説明します。公式サイトはこちらになります。
パッケージ
パッケージの指定は Java と同様にファイルの先頭に記述します。
package com.mokelab.myapp変数と定数
        メソッドや関数の中で変数を作るには、var 変数名: 型名とします。
      
var name: String = "moke"右辺から型が推論できる場合は型を省略できます。この機能を型推論と呼びます。
var name = "moke" // nameはString型になる
        定数はvarの代わりにvalにします。再代入の必要がない場合はなるべくvalを使うようにしましょう。
      
val name = "moke"コメント
コメントの書き方は Java や C 言語系とほぼ同じです。
// 1行コメント
/*
 複数行コメント
 */「ほぼ」と書いたのは、Kotlin では複数行コメントのネストが許されているためです。
/*
  /* 複数行コメントの中に
   * また複数行コメントが書ける
  */
*/文字列テンプレート
        文字列の中で$変数名を使うと、値を埋め込むことができます。
      
val name = "moke"
val msg = "こんにちは!$nameさん!"メソッドを呼んだりする場合は${}を使います。
val name = "moke"
val msg = "名前の長さは${name.length}"文字列の中で$を使いたい場合は次のようにします。
val msg = "${'$'}9.99 の買い物をした"条件分岐
        ifを使います。()も必要なので注意しましょう。
      
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    // 何か処理
} else {
    // 何か処理
}
        なお、Kotlin のif
        は文ではなく式なので、次のように右辺として使うことができます。then と
        else
        の各ブロックで最後に評価された値が式の値になります。当然ですがこの場合は
        else が必須になります。
      
val msg = if (score >= 60) {
    // 何か処理
    "合格"
} else {
    "不合格"
}
when
        Java や C の switch に似ていますが、色々なことができます。各 case
        の最後にbreak は書きません。詳しくは次回以降に説明します。
      
when(id) {
    1 -> print("id=1のボタンがクリックされたよ")
    2 -> {
        // 何か処理
        // 複数行実行したい場合は、{}で。
        print("id=2のボタンをクリックしたな?")
    }
    else -> print("不明なボタンだ。。。")
}配列
        arrayOf()を使うと配列を作ることができます。多くの場合listOf()を使いますが、Android
        SDK
        のメソッドで、リストではなく配列を要求するものがあるため、時々使います。
      
val a = arrayOf(1, 2, 3)for ループ
Java の拡張 for ループのみサポートされています。
val names = listOf("moke", "piyo", "mallo")
for (name in names) {
    println(name)
}
        どうしてもインデックスが欲しい場合は indices を使います。
      
val names = listOf("moke", "piyo", "mallo")
for (i in names.indices) {
    println("$i = ${names[i]}")
}ループを途中で抜けたい場合は break を使います。
val names = listOf("moke", "piyo", "mallo")
for (i in names.indices) {
    if (i == 1) {
        break
    }
    println("$i = ${names[i]}")
}Nullable と Non-null
        Kotlin の変数には「null が入るかどうか」を指定する必要があります。null
        が入る可能性がある場合は、型名の後ろに?をつけます。?のついている変数は
        Nullable な変数と呼び、使用する際は null チェックや、null
        の時に困らないような記述をする必要があります。なお、?のついていない変数を
        Non-null な変数と呼びます。
      
if で null チェックをした場合、チェック後は non-null な変数として扱うことができます。この仕組みをスマートキャストと呼びます。
val name: String? = getName() // nullが返ってくるかもしれない
if (name != null) {
    // ifでnullチェックしたので、この中はnameがnon-nullな変数になる
    println("名前は$nameなんですな?")
}次のように null だったら return した場合もスマートキャストがはたらきます。
val name: String? = getName() // nullが返ってくるかもしれない
if (name == null) {
    return
}
// ここから先、nameはNon-nullな変数として扱われるエルビス演算子
        ?:をエルビス演算子と呼びます。?:の左側が null
        になった場合、?:の右側の値にするか、return
        で処理を中断させることができます。
      
次の例は null だったらデフォルト値をセットする例です。
val name = getName() ?: "名無しさん"次の例は null だったら処理を中断する例です。
val a = activity ?: return // activityがnullだった場合はここで処理をやめちゃえこの演算子がエルビス演算子という名称なのは、エルビス・プレスリーの顔文字に似ているためです。詳しくはこちら
まとめ
今回は Kotlin の基本文法を説明しました。Java や C を学んでいれば、それほど学習にコストはかからないと思います。Android アプリ開発ではクラス定義が何度も登場するので、次回は Kotlin でのクラス定義を説明します。