変数 var と val
Kotlin では変数を宣言するのにキーワードが2つあります。var と val です。
var は普通の変数 variable
var はいわば普通の再割り当て可能な変数で Mutable Reference です。変数は英語で variable と言いますが、 var はその頭文字からきています。
変数の型は変数名の後にコロン (:) に続けて記載します。
典型的な変数の宣言は次のようになります。
var i: Int
データ型の種類については「データ型とリテラル」をみてください。
また同時に値を割り当てることもできます。
var i: Int = 10
型の推測 - type inference
変数の定義時に割り当てる値からデータ型が推測可能な時は、省略可能です。
var i = 10
Kotlin は静的型付け言語 (statically typed language) です。このため、コンパイル時に変数の型がわからないといけないわけですが、 上記のように 10 という数字を割り当てると同時に変数 i を定義していますので、i の型は明示的に Int と書いていなくてもわかるわけです。
このように状況から類推して型を決められることを type inference といいます。
ちなみに、同じ 10 でも後ろに "L" をつけて、 10L とすると Long として扱われます。
fun main() { val i = 10 val j = 10L println("i=$i type=${i::class.qualifiedName}") println("i=$j type=${j::class.qualifiedName}") }
実行結果
i=10 type=kotlin.Int i=10 type=kotlin.Long
null になるとき ? を付ける
Kotlin では NullPointerException をなくすべく、基本的に変数は null になりません。 null を許可する場合には、型指定の後ろに ? をつけます。
val は「読み取り専用」の value
一方、val は参照が変更できない変数、Immutable reference です。 Java の final 変数に相当します。val というのは value の頭文字からきています。
val は読み取り専用になりますが、定数 (constant) ではありません。例えば次の例では、Foo クラスの bar プロパティは val なので値を外部から割り当てることはできませんが、定数ではありませんね。
import java.util.* class Foo { val bar: Int get() = Random().nextInt(100) } fun main() { val foo = Foo() println("foo.bar = ${foo.bar}") println("foo.bar = ${foo.bar}") }
実行結果は次のようになりました。実行するたびに変わります。
foo.bar = 67 foo.bar = 29