Kotlin - 変数

公開日:2019-11-06 更新日:2019-11-06
[Kotlin]

1. 概要

変数の使い方についてです。


2. 基本

val a: Int = 10
val b = 20
var c = a + b

println(a) // 10
println(b) // 20
println(c) // 30


3. 再代入可、読込専用

val で変数を宣言すると、読込専用となり、再代入した時にエラーになります。
val a = 10
a = a + 1 // error: val cannot be reassigned

再代入をする場合は、var で変数を宣言します。
var a = 10
a = a + 1

他の言語と異なり、readonly などを付ける必要がないため、 基本は val で定義して、再設定する必要が出てきたら var に変更するのが良いと思います。


4. 変数の型

val valBool1 :Boolean = true
val valBool2 :Boolean = false

val valByte :Byte  = 1 // -128 ~ 127
val valShort:Short = 1 // -32768 ~ 32767
val valInt  :Int   = 1 // -2147483648 ~ 2147483647
val valLong :Long  = 1 // -9223372036854775808 ~ 9223372036854775807

//val valFloat :Float  = 1.1 // error: the floating-point literal does not conform to the expected type Float
val valFloat :Float  = 1.1F // 4バイト
val valDouble:Double = 1.1  // 8バイト

var c:Char = 'あ'
val s:String = "Hello"

val x:Any = "Any"


5. Null許容型

変数が null を保持する場合は、変数の型の最後に ? を付ける必要があります。
? を付けずに null を代入するとエラーになります。
var s:String? = null

//var s:String = null // error: null can not be a value of a non-null type String

Null許容型の変数のプロパティやメソッドを使用する場合は、「?.」や「!!.」を付けます。
「?.」と「!!.」の違いは、null を返すか実行時にエラーにするかです。
var s:String? = "12345"
//println(s.length) // error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
println(s?.length)  // 5
println(s!!.length) // 5

s = null
println(s?.length)  // null
println(s!!.length) // 実行時エラー:kotlin.KotlinNullPointerException

また、null 以外の値が入っていることが保証されている場合には、「?.」や「!!.」を付けなくても問題ありません。
var s:String? = "12345"
if (s != null) {
    println(s.length) // 5
}


6. 変数の初期化

変数は宣言時に初期化する必要はありませんが、使用する前までには必ず初期化する必要があります。
初期化していない変数にアクセスすると、エラーになります。
Null許容型でもエラーになります。
val s:String?
println(s) // error: variable 's' must be initialized


7. 他の数値型への変換

他の言語と異なり、数値型同士の型変換でも、メソッドを使う必要があります。

Int から Long へ変換する際も、ただ代入するとビルドエラーになります。
var v1:Int = 1
var v2:Long = v1 // error: type mismatch: inferred type is Int but Long was expected
println(v2)

変換する場合は、toLong() など、各数値型に変換するメソッドを使用します。
var v1:Int = 1
var v2:Long = v1.toLong()
println(v2) // 1