Dive into Coding Life

KotlinLearning: 01-1 変数の宣言

30/12/2020

変数の宣言

Kotlinでは以下のように変数を宣言します。

var name : String = "Coffee"

上記変数の宣言は以下のように分解されます。

  • var:変数定義キーワード
  • name:変数名
  • String:型定義
  • =:代入演算子
  • Coffee:初期値

変数定義キーワード

Kotlinには二種類の変数定義キーワードがあります。

var、val

var

varは変更可能な変数を定義するために使用します。
varで定義された変数は初期化後も別の値を代入することができます。
ただし変数の型を変更することはできません。

val

valはJavaのfinalキーワード同様、初期化後変更不可な変数を定義するために使用します。
一般的には動的に変数を変更する必要がない場合、valを使います。
イミュータブルな参照、イミュータブルなオブジェクト、副作用のない関数を使うことによりコードは関数型プログラミングに近づきます。

変数はvalを用い宣言時に初期化する方が望ましいですが、値がプログラム内で動的に変わる場合はvarを用いて変数宣言します。

変数の初期値が決まっていない場合、変数の型を明示的に宣言することにより初期化を遅らせることができます。
valを使う場合は変数が定義されたブロックの実行時に必ず一度だけ初期化されなければなりません。
その限りであれば初期化する値を動的に決定することも可能です。

val errorMessage: String
if(errorType == 404) {
  errorMessage = "Not Found"
} else {
 errorMessage = "Unknown Error"
}

valで宣言された変数自体はイミュータブルですが、変数がコレクションの場合などはその中身はイミュータブルとは限りません。

lateinit var

動的に変数を初期化したい場合はlateinit varを用いて変数を宣言します。
lateinit varで宣言した変数を初期化せずに使用すると、UninitializedPropertyAccessExceptionが発生します。

従来Javaで行っていたようなvarで宣言した変数をnullで初期化するのに比べ、lateinit varを使用するとnull安全を保障できる利点があります。

null安全

JavaにはないKotlinの特徴としてvar変数宣言時にnullを許容するかどうかを決める必要があります。
Kotlinはデフォルトではnullを許容しません。
nullを許容するには型の後ろに?を付ける必要があります。


// var nonNullable Sring = null
var nullable : String? = null

変数名

変数名は英数字のキャメルケース(ローワーキャメルケース)を使うのが一般的です。
ローワーキャメルケースは小文字で始まり、単語の区切りは大文字で示します。
getValue
testCase
など。

これはルールではありませんが、一般的なマナーです。
例外として単体テストなどのテストコードでは、可読性の観点から漢字で変数を宣言する場合もあります。

var name: String? = null

nullを許容するとプログラム実行時にNullPointerExceptionが発生する可能性があります。

Kotlinのスマートキャストはnull確認をした後のスコープで再度null確認をする必要はありません。
この機能はnullチェック以外に型チェックなどにも適用されますが、別のスコープまでは及びません。

val name: String? = null
if (name != null) {
    // nameがnullであるか確認済みとして扱われるので、
    // name?.toUpperCase()と書く必要はない
    println(name.toUpperCase())
}