情報と電子とおおかた遊び

プログラムの備忘録を綴りつつ、適当に遊びも記載するゆるいブログ

Kotlinのいろは1

変数の定義

基本の型

//一度代入すると、変更不可能な変数
val test : "型名" = "値"

//再度、代入可能な変数
var test : "型名" = "値"

型名は結構ありますが、基本は他言語のプリミティブ型と同じですね。

型名 種類 ビット幅
数値型
Double 浮動小数 64 123.4
Float 浮動小数 34 123.4f
Long 整数 64 1234L
Int 整数 32 1234
Short 整数 16 1234
Byte 整数 8 123
その他
Boolean 真偽値 不明 true/false
Char 文字 文字コードによる? 'a', '0'
String 文字列 文字コードと文字列の長さによる? "Hello"

実例:

val testInt : Int = 1234
val testBool : Boolean = true
val testChar : Char = 'a'
val testStr : String = "Hello, World"


便利機能:型推論

スクリプト系言語ではよくある話ですが(phpとか)、 代入する値が、コンパイラが推測するのに十分な情報を満たしていれば、 型を宣言しなくても、値を代入できます。

C言語の静的型付けに慣れてる身としては、 型推論はコードの可読性に影響が出るので、明示的に宣言したいですが・・・ とはいえ、最近の言語はほとんど型宣言は省略できるので、 世の中の流れに従ったほうがいいんでしょうね・・・

注意1

Kotlinでは、セミコロン ";"、はつけてもつけなくてもいい。 ただし、ややこしいのでベストプラクティス的には、 一度付けたらすべてに付ける、一度付けなかったら全部に付けない。 チームでプログラムを組むときは、事前に付ける付けないをはっきりさせておく。

注意2

Kotlinでは"暗黙的な型変換"はしないように。 といっても、わかりにくいと思うので下のJavaコードを見てみてください。

/*int型をdouble型へ暗黙的な型変換*/
int x = 1234;
double y = x; //yを1234.0のdouble型に変換完了

/*double型をint型へ暗黙的な型変換*/
double x = 1234;
int y = x; 
//error 大きなビット数(double:64ビット)から
//小さなビット数(int:32ビット)の型変換はできない。

上記のコードのような、変換はKotlinではできない。 確かにJavaのように型のビットサイズで、 ランタイムエラーが起きたり起きなかったりは、 バグの温床になりやすい そのためKotlinでは、暗黙的型変換は完全にエラー扱いとなっているっぽい。 じゃあ、型変換したいとき、

どないすりゃあええんじゃあ!
こないせぇ!

val testInt : Int = 1234

//Long型に変換
val testLong : Long= testInt.toLong()

//String型に変換
val testString : String = testInt.toString()

"to目的の型"で大体の変換はできます。便利ですね!

その他の型

文字列

既に基本の型で説明してありますが、追加の情報です。

Stringのつなぎ方

val test = "Hello, "
val test2 = "World"
val result = test + test2 // result は "Hello, World"になります

こんな方法も使えます。まさに、php的な書き方ですね。

val test = "World"
println("Hello, $test") // "Hello, World"が出力されます

配列

しっかりと型を宣言しつつの、配列宣言。
恐らく、オーバーヘッドがちょっと少な目。

//Int型の配列
val intArray : IntArray = intArrayOf(1, 2, 3)
println(intArray[0]) // 1が出力

//Char型の配列
val charArray = charArrayOf('a', 'b', 'c')
println(charArray[0]) // 'a'が出力

そんな小さなオーバーヘッド気にしないから、 もっと、ぱぱっと簡単に宣言したい方はこちら。

//Int型の配列
val intArray = arrayOf(1, 2, 3)
println(intArray[0]) // 1が出力

//Char型の配列
val charArray = arrayOf('a', 'b', 'c')
println(charArray[0]) // 'a'が出力

因みに、配列のサイズなどは以下のようにして簡単に取得できます。

val intArray = arrayOf(1, 2, 3)
println(intArray.size) // 配列のサイズ、3が出力

他にもいろいろあるようなので、公式ドキュメントを要確認。

コレクション

複数の値のコンテナとなるようなオブジェクトを、 「コレクション」と呼びます。

コレクションには、リスト、セット、マップのというものが存在します。 少々厄介なのは、それぞれミュータブルとイミュータブルな、 リスト、セット、マップが存在しています。 それぞれ状況に応じて、コレクションを生成してください

リスト

Listはインターフェースの一つListで表現された、コレクションの一つです。 まぁJavaと考え方はそのままです。 勿論、Listインターフェースを実装した、 ArrayListやらLinkedListもKotlin内にあります。

//Listを生成
val intList = listOf<Int>(3,2,1) 
println(intList) // [3, 2, 1]が出力

//サイズを出力
println(intList.size) // 3が出力

//指定した値を出力
println(intList[1]) // 2が出力

//error イミュータブルのため
intList[0] = 5

さて、前述の通り、イミュータブルで宣言されているため、 値を変更することができません。 勿論、値の追加・削除もできません。 というわけで、宣言の仕方を変えましょう。

//Listを生成
val intList = mutableListOf<Int>(3,2,1) 
println(intList) // [3, 2, 1]が出力

//サイズを出力
println(intList.size) // 3が出力

//指定した値を出力
println(intList[1]) // 2が出力

//値の変更
intList[0] = 5 
println(intList)// [5, 2, 1]を出力

//値の削除
intList.removeAt(0)
println(intList) // [2, 1]を出力

//値の追加
intList.add(0, 5) // [5, 2, 1]
intList.add(1, 2) // [5, 2, 2, 1]
println(intList) // [5, 2, 2, 1]を出力
セット

セットは、重複がないリストと考えてください。 所謂、集合です。

//イミュータブルSetを生成
val intSet = setOf<Int>(1,2,1,3) 
println(intSet) // [1,2,3]が出力

//ミュータブルSetを生成
val muteIntSet = mutableSetOf<Int>(1,2,1,3) 
println(muteIntSet) // [1,2,3]が出力
muteIntSet  -= 2
println(muteIntSet) // [1,3]が出力
マップ

マップは連想配列、キーワードと値をセットにして保存する型です。 キーワードを指定して、値を取り出すことができるので、いろいろ便利です。

//イミュータブルSetを生成
val intMap = mapOf<String, Int>("one" to 1, "two" to 2) 
println(intMap) // {"one"=1, "two"=2}が出力

//ミュータブルSetを生成
val muteIntMap = mutableMapOf<String, Int>("one" to 1, "two" to 2) 
println(muteIntMap["one"]) // 1が出力
println(muteIntMap["three"]) // nullが出力
muteIntMap += "three" to 3
println(muteIntMap) // {"one"=1, "two"=2, "three"=3}が出力
muteIntMap -= "two"
println(muteIntMap) // {"one"=1, "three"=3}が出力

レンジ

Kotlinにはレンジというクラスがあるようです。 まぁスクリプトではよく見る書き方です。

//5が1から12の中に存在するか
println(5 in 1..12) // trueが出力

//8から10のレンジというクラスをあらかじめ定義。
val intRange : IntRange = 8..10
println(5 in intRange) // falseが出力

//勿論 "!"も使える
println(5 !in intRange) // trueが出力

//リストも簡単に作成
println((1..4).toList()) // [1, 2, 3, 4] が出力

//reverseで逆順のリストを作成
println((1..4).reversed().toList()) // [4, 3, 2, 1] が出力

//downToでも逆順のリストが作成できる
println((1 downTo 4).toList()) // [4, 3, 2, 1] が出力

//stepで数の上がり方も操作できる
println((1..7 step 2 ).toList()) // [1, 3, 5, 7] が出力

まとめ

とりあえず、いろいろある基本の型を羅列しました。 本当はもっとざっくり、関数定義から、クラス定義とか話したかったんですが、 内容が肥大化しました・・・ 続きはまた書きます。

参照

多くの情報は、この書籍を参考に記載しております。

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング