KotlinでAndroid-No.04(変数の宣言)

対象バージョン:Android Studio v4.1, Kotlin v1.4

変数の宣言

さて、何かを計算するプログラムを作成するには「変数」を使います。

今回はKotlinでの変数の宣言について見ていきます。

前置き

ここで紹介している内容は、僕自身がKotlinでプログラミングする上で必要と思う事を記載しています。(ほぼ備忘録です)

間違いや、不足部分、正しくない使い方も多々あると思いますので、記載内容に疑問がある場合はKotlinの正式なサイトや、他の方の記事も参考にしてみてください。

varとval

変数の宣言の仕方は下記の様になります。

var <変数名> [:型] [=初期値(型指定がない場合は必須)]

もしくは

val <変数名> [:型] [=初期値(型指定がない場合は必須)]

コード内で1度しか代入しない場合は「val」を、2度以上値を代入する場合は、「var」を使います。

※『「val」はimmutable values(変化しない値)に、「var」はmutable values(変かする値)に利用する』とも言いますね。

1度しか代入しない変数にも「var」を使えますが、Android Studioでは警告を示すマークが付きます。(重要な警告が埋もれる可能性もあるので、できるだけ「val」を使った方が良いでしょう)

また「val」で宣言した変数に2回目以降代入をしようとすると、エラーになります。(「var」を使う必要があります)

「var」や「val」は予約語になるので、これらを変数名として利用する事は出来ません。(個人的に「val」は一時的な値の格納する変数としてよく使っていたのですが…^^;)

型の省略

※この連載では「型」と記載していますが、「クラス」と言った方がいいかも知れません。

変数の宣言時には型を省略できますが、初期値が必要になります。

var result = true

※初期値がない場合は、型は省略できません。(型の推測が出来ないので、当然といえば当然ですね)

初期値の省略

変数の宣言時には、型を指定すれば初期値は省略できます。

var a : Int

Kotlinには「暗黙の初期化」は存在しません(「整数型の変数で初期値なしの場合は「0」が代入される」というような事はありません)。変数を利用する場合には、初期化する(値を代入する)必要があります。そうしないとエラーになります。

基本的な変数の型

整数や浮動小数点を宣言する場合は下記の型を利用します。

符号付き整数

ビット数最大値最小値
Int322147483647-2147483648
Byte8127-128
Short1632767-32768
Long649223372036854775807-9223372036854775808

以下の様なコードを書けば、各型の変数を取得できます。

    fun TestFunc()
    {
        // テキストボックスに処理結果を表示
        val editTextResult : EditText = findViewById(R.id.editTextResult)
        editTextResult.append("[Int] SIZE_BITS = " +  Int.SIZE_BITS + ", MAX = " + Int.MAX_VALUE + ", MIN = " + Int.MIN_VALUE)
        editTextResult.append(System.lineSeparator())
     }

※Emulatorを使うTextEditコンポーネントの文字列をWindowsのテキストエディタなどにコピペが出来るので楽です^^

代入できる値は、10進数、2進数、16進数表記が利用出来ます。
ただし、Longの場合は10進数の後に「L」が必要になります。

var a : Int = 255
var b : Byte = 0b11111111
var c : Short = 0xFF
var d : Long = 1000L // Long型の場合は「L」を付ける

符号無し整数

符号無し整数は最近のバージョンのKotlinなら利用できます。

ビット数最大値最小値
UInt3242949672950
UByte82550
UShort16655350
ULong64184467440737095516150

代入できる値は、10進数+「u」の表記のみで、2進数、16進数表記は利用できません。

var a : UInt = 255u
//var b : UByte = 0b11111111  // 2進数での初期化は不可
//var c : UShort = 0xFF       // 16進数での初期化は不可
var d : ULong = 1000u

Android Studioで符号無し整数を使うと、警告マークが付きます。

メソッドに「@ExperimentalUnsignedTypes」アノテーションを追加する事で警告が消えます。(「実験的」…か^^;)

KotlinではSingned(符号あり)、Unsigned(符号無し)の区別は厳密にされており、そのままでは代入、演算、比較がエラーになります。

Signed とUnsignedの演算はエラーになる
Signed と Unsigned の比較はエラーになる

※どうしても比較したい場合は、.toInt()や.toUInt()で型をそろえて行う必要があります。ただ、その場合、そもそもの設計に何等かミスがあると考えた方が良いでしょう…^^;

浮動小数点

ビット数
Float32
Double64

Floatの場合、代入できる値は、数字+「f」(もしくは「F」)の表記になります。(「f」を付けないとエラーになります)

val a : Float = 10F
val b : Float = 10.0F

Doubleの場合、代入できる値は、小数点付き数字、もしくは、仮数部+指数部の表記になります。

val c : Double = 1.23
val d : Double = 1.0E-10  // 1.0 x 10^(-10)

「val e : Double = 1」の様な書き方はエラーになります。型は浮動小数点、初期値が整数型になり、型が不一致になるためです。

文字型

ビット数文字コード
Char1616bit Unicode Character

Char型への代入は、1文字を「’」(シングルクォーテーション)で囲んだものを使用します。

val a : Char = 'X'
val b : Char = 'あ'

文字列型

String

文字列型への代入は、文字列を「”」(ダブルクォーテーション)で囲んだものを使用します。

val a : String = "Hello World!"

ブーリアン型

Boolean

ブーリアン型への代入は、「true」もしくは「false」のみ利用可能です。

val a : Boolean true
val b : Boolean false

型宣言が不要な場合、必要な場合

型宣言が不要なのは「初期値から型が明確に推測できる場合」、型宣言が必要なのは「初期値から型宣言が明確には推測できない場合」となります。

後者は、Byte, Short, Long, UInt, UByte, UShort, ULongになります。

また、Android Studioで型名が薄いグレーで表示されるものは、型宣言を省略できます。

「null」の代入

Kotlinでは通常の方法で宣言された変数に「null」を指定する事はできません。
(non-null変数として扱われます)

「null」を指定したい場合は、型宣言の最後に「?」を付けて、non-nullable 変数(nullを代入可能な変数)と明示する必要があります。

non-null変数にnon-nullable変数を代入する場合は、non-nullable変数にnullでない値を代入した後でないとエラーになります。

※上図の様にKotlinのSmart-cast機能が働く場合もありますが、通常は、

「non-null宣言されている変数はnullチェック不要、non-nullable宣言されている変数はnullチェックが必要」

と考えた方がよさそうです。

宣言時の注意事項

複数行に渡る宣言

1行が長くなると演算子を使い複数行に渡って宣言する場合があります。

誤って行末などの演算子を削除してしまっても、コード上(文法上)ではエラーにはなりません。
Android Studio上で警告が出る場合もありますが、警告が出ない場合もあるので、注意が必要です。

こういった事が起きないように『行末は「;」が必須』や『改行時は「\」が必要』みたいなルールがあればいいのですが…(- -;

次回予告

次回はフロー制御部分について見ていきたいと思います。


前の記事次の記事
No.03(勉強用アプリの作成)No.05(フロー制御)