変数 var と val

Kotlin では変数を宣言するのにキーワードが2つあります。varval です。

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

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Kotlin 入門