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