Mokelab Blog

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 でのクラス定義を説明します。

本サイトではサービス向上のため、Google Analyticsを導入しています。分析にはCookieを利用しています。