覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Kotlin - 変数の基礎

「Kotlinイン・アクション」 を読みながら写経してます。(Javaと比較しながら)

Kotlinイン・アクション

Kotlinイン・アクション

  • 作者: Dmitry Jemerov,Svetlana Isakova,長澤太郎,藤原聖,山本純平,yy_yank
  • 出版社/メーカー: マイナビ出版
  • 発売日: 2017/10/31
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (2件) を見る


Kotlinにおける変数

Kotlin では多くの変数宣言で型を省略して記述します。

val value = 100

必要に応じて以下のように明示的に型を指定する事も可能です。

val value: Int = 100 


式本体の関数と同じように、型を指定しなければコンパイラは変数の初期化式を解析して、その型を変数の型に使用します。
この例では初期化式の 100 が Int型なので、変数もInt型になります。

例えば、以下のように浮動小数点をもったい定数を初期化式に使用した場合は、変数は Double型になります

val valueDouble = 7.5e6


変数が初期化式を持たない場合は、その型を明示的に指定する必要があります。
変数にどのような値が割り当てられるかの情報がなければ、コンパイラが型を推論することができないからでです。

val unknown: Int
unknown = 35


ミュータブル変数・イミュータブル変数

変数を宣言するためのキーワードには次の2つがあります

  • val
    • value に由来
    • イミュータブル(不変)な参照です。valで宣言された変数は一度初期化されると、そのあとで値を再度割り当てることはできません。
    • Javaにおけるfinal変数に対応しています
    • Javaの言語仕様に val は存在しませんが、似たようなものを Lombok が提供しています
  • var
    • variable に由来
    • ミュータブル(変更可能)な参照です。こん変数の値は変更することができます。
    • Javaの(finalではない)通常の変数の宣言に対応しています。
    • ちなみに、JavaでもJava 10 からは var による型を省略して変数宣言が可能です。


基本的には、Kotlin では全ての変数は val キーワードで宣言するように努めるべきとされています。
必要な時だけ、varに変更します。
イミュータブルな参照、イミュータブルオブジェクト、副作用のない関数を使うことで、コードは関数型プログラミングスタイル に近づきます。

val 変数は、その変数が定義されたブロックの実行時に必ず一度だけ初期化されなければなりません。
しかし、初期化処理が1つだけしか実行されないことが保証されているのならば、状況に応じて異なる値を割り当てることができます。(以下の message 変数のような例)

val message: String

// success(: Boolean) の値が別途 決まるものとする
if (success) {
    message = "Response is success"
} else {
    message = "Response is failed"
}


val で宣言された変数の参照自体はイミュータブルで変更不可能ですが、それが指すオブジェクトはミュータブルになり得ます。以下のようなListの値がそれに該当します

val list = arrayListOf("Taro", "Jiro")    //  イミュータブルな参照として
list.add("Saburo")  //  参照が指す先のオブジェクトへの変更(追加)は可能

println(list) // -> [Taro, Jiro, Saburo]


var キーワードはによって値の変更は可能ですが、その型は固定されています。
次のようなコードはコンパイルエラーになります。

var numeric = 123
numeric = "Hello"    // 型がミスマッチでコンパイルできない

この例では、文字列を代入しようとしたところでエラーになります。文字列の型(String 型)が、期待していた型(Int 型)と異なるからです。
コンパイラは初期化時のみ型を推論し、それ以降で割り当てられる値は、型の決定には考慮されません。



関連エントリ