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プログラミング
- 作者: 長澤太郎
- 出版社/メーカー: リックテレコム
- 発売日: 2016/07/13
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る