Kotlin で変数を定義するには、val
キーワード(あるいは var
キーワード)を使用します。
変数定義時に値を初期化する場合は、コンパイラが型を判断してくれるので、多くの場合は型の記述を省略することができます(この機能を型推論 (type inference) と言います)。
val s = "Hello" //=> val s: String = "Hello"
val n = 100 //=> val n: Int = 100
val f = 7.5e6 //=> val f: Double = 7.5e6 (= 7.5x10^6)
ただし、変数の定義と同時に初期値を指定しない場合は、必ず型の指定が必要です。
型は、変数名の後ろに : 型名
という形で指定します(Pascal や Scala、Swift などと同じ)。
val name: String
name = "Maku"
println("Hello, $name!")
Kotlin には変数を定義するためのキーワードとして、val
と var
が用意されています。
val
: 再代入できない参照を保持するための変数 (immutable reference)。Java の final
変数に相当。value の略。var
: 再代入可能な変数 (mutable reference)。variable の略。val a = 1
var b = 1
a = 2 // NG (Val cannot be reassigned)
b = 2 // OK
使い分けの方針としては、変数を定義するときはまずは再代入できない val
を使用することを考え、必要なケースでのみ var
を使用するのがよいでしょう。
こうすることで、コードレビュー時などに変数の変化を追う必要性が下がるため、保守性が高くなります。
Java を使って同じようなことを実現しようとすると、コードの中に final
があふれてしまって逆に読みにくくなってしまうのですが、Kotlin の場合は val
も var
もタイプ量は一緒なので、積極的に final
相当の val
を使用してコーディングすることができます。
Kotlin の変数はオブジェクトの参照を格納するものですが、Java と異なりデフォルトでは null
を代入することが禁止されています。
null
を代入することが可能な変数を定義するには、型名の後ろに ?
を付けて定義します。
var s: String? = null
s = "Hello"
ちなみに、このルールは関数のパラメータでも同様です。
fun greet(name: String?) { // null も渡せる
println("Hello, $name")
}
Kotlin の代入 (=
) は、式 (expression) ではなく文 (statement) として扱われます。
つまり、次のような、ある変数への代入結果を、そのまま別の変数へ代入することはできないということです(コンパイル時に構文エラーになります)。
var a = b = 100 // ERROR
一方、Java では代入は式 (expression) として扱われるので、このような代入の連鎖が許されています。
Kotlin ではこのような書き方を意図的に禁止することで、代入 (=
) と比較 (==
) の記述ミスを避けることを狙っています。