Kotlinの名前が分からないアレ

Kotlinを学び始めの初心者がサンプルソースコードを読んでいると、名前も用法も分からない記号に遭遇します。?.とか!!とかですね。名前が分からないのでググるのも苦労しますね。このページではそういったKotlin特有の記号の用法について説明します。

Nullable記号 ?

var s1: String? = null    // OK
var s2: String = null    // Error

変数の型についている?(クエスチョンマーク、はてなマーク)は、その変数がnullになり得る(nullを代入できる)ことを示しています。Kotlinでは変数がnullになり得るかどうかを厳密に区別します。?がついている型をNullable、ついていない型をNon-Nullといいます。

安全呼び出し (Safe Call) ?.

val i1: Int? = 1
val s1 = i1?.toString()    // "1"
val i2: Int? = null
val s2 = i2?.toString()    // null

Nullableな変数のメンバ変数やメソッドにアクセスするには、変数の後ろに?.(クエスチョンマーク、はてなマークと、ドット)をつけます。この記法を使うと、変数がnullでない場合は通常のメンバアクセスになり、nullの場合はメンバアクセスせずにnullを返します。上の例では、i1はnullではないのでtoString()が呼び出されてs1には文字列"1"が代入されますが、i2はnullなのでtoString()は呼び出されず、s2にはnullが代入されます。Javaなどではnullに対してメンバアクセスしようとすると例外が発生しますが、Kotlinではそれを防げるというわけです。

Not-Null Assertion Operator !!

val i: Int? = 1
val s = i!!.toString()

変数の後ろに!!(エクスクラメーションマーク、びっくりマークを2個)をつけると、Nullableな変数を強制的にNon-Nullに変換します。もし変数がnullだった場合は、例外が発生します。Kotlinのnullに対する安全性を損ねてしまうので、基本的には使わないほうがよいでしょう。

エルビス演算子(Elvis Operator) ?:

val s1: String? = "Hello"
val s2: String = s1 ?: "default"

?:(クエスチョンマーク、はてなマークと、コロン)は、エルビス演算子(Elvis Operator)といいます。この演算子は、第1項がnullでない場合は第1項の値を返し、nullの場合は第2項の値を返します。変数がnullの場合には特定のデフォルト値を使いたい場合などに有用です。