Kotlin変数宣言

変数宣言

基本的に変数は次のように宣言する。

valまたはvar 変数名:  = 

変数宣言には、不変変数と可変変数の2種類がある。

可変変数(var)

varで宣言すると、変数に再代入できる。つまり、可変(Mutable、変更できる)変数になる。varはvariableを意味する。

var a: Int = 1
var b = 2
var c: Int
c = 3

宣言時に初期値を指定した場合、変数の型を省略できる型推論(type inference)機能も提供される。

不変変数(val)

valで宣言すると、変数に再代入できない。つまり、不変(Immutable、変更できない)変数になる。valはvalueを意味する。

val MAX_COUNT: Int = 1024
val MAX_SIZE = 1024

valキーワードを使用した変数は、文脈上1回だけ初期化できる。Javaのfinalに似ている。

varvalのコンパイル

varはいつでもどこでも代入できるが、valで宣言すると再代入時にコンパイルエラーが発生する。

var foo = "a"
hoge = "b"  // OK
val foo = "a"
fuga = "b"  // コンパイルエラー

代入を何度も繰り返すのは望ましくないため、基本的にはvalを使うようにする。

もちろん、varを使わなければならない場合もある。

定数宣言(const)

constで宣言すると、より効率的な定数を宣言できる。

const val FOO = "Foo"

変数のデータ型

VariableTutorial.kt

fun main(args: Array<String>) {
    val a: Int
    var b: String
    val c = 3;
    var d = "dString"
    a = 34
    b = "bString"
    println("a = $a is Int? ${a is Int}")
    println("b = $b is String? ${b is String}")
    println("c = $c is Int? ${c is Int}")
    println("d = $d is String ${d is String}")
}
a = 34 is Int? true
b = bString is String? true
c = 3 is Int? true
d = dString is String true

Javaとは異なり、intStringのようなデータ型を書かず、varまたはvalだけを明示してもよい。

注意すべき点は、変数宣言だけをする場合はvar a: Int, val b: Stringのようにデータ型を必ず明示する必要があるが、変数を宣言して値を定義する場合は、var a = 34のようにデータ型が自動で指定されるため省略できることである。これを型推論(type inference)という。

Null非許容変数、Null許容変数

nullは値が存在しないことを意味する。通常の変数にはnullを代入できない。型名に疑問符(?)を付けると、nullを許可する変数(Nullableパラメーター)を定義できる。

var a: String = null		 // nullは代入できない
var b: String? = null		 // nullを代入できる

Nullable変数は、そのままではプロパティや関数を呼び出せない。

fun main() {
    var a: String? = "ABC"
    var b: String? = "ABC"
    var c: String? = "ABC"
    var d: String? = "ABC"

    // nullではないことを確認するif文の中ではNon-nullableとして扱われる(スマートキャスト)
    if (a != null) { println(a.length) }
    
    // ?.を使うと、bがnullの場合は式全体がnullになる(セーフコール)
    println(b?.length)

    // !!を使うと強制的に使用できる(実行時エラーが発生する可能性があるため危険)
    println(c!!.length)
    
    // Elvis演算子(?:)を使用してnullにならないようにする。
    d = d ?: "(Unknown)"
    println(d.length)
}