Kotlinデータ型

基本データ型

基本的な形は次のとおりである。

var a: Boolean = true     // 論理値(true, false)
var b: Byte = 123         // 8ビット整数(-128 ~ 127) 
var c: Short = 123        // 16ビット整数(-32768 ~ 32767) 
var d: Int = 123          // 32ビット整数(-2 31 ~ 2 31 -1) 
var e: Long = 123L        // 64ビット整数(-2 63 ~ 2 63 -1) 
var f: Float = 12.3F      // 32ビット浮動小数点
var g: Double = 12.3      // 64ビット浮動小数点 
var h: Char = 'A'         // 文字(1文字)
var i: String= "ABC"      // 文字列

Boolean

Booleanはtrueまたはfalseで表す。

var b1: Boolean = true 
var b2: Boolean = false

数値(Byte, Short, Int, Long, Float, Double)

数値は次のように指定する。8進数(0o)はサポートされない。アンダースコア(_)は無視される。

123          10進数(Int) 
123L         10進数(Long) 
0x0F         16進数 
0b10111100   2進数 
123.4        実数(Double) 
1.23e2       実数(Double) 
123.4f       実数(Float) 
1.23e2       実数(Float) 
12_345_678   桁区切り

文字(Char)

文字はシングルクォートで囲む。

'A'

次のエスケープシーケンスを使用できる。

\t         // タブ(TAB) 
\b         // バックスペース(BS) 
\n         // 改行(LF) 
\r         // 復帰(CR) 
\'         // シングルクォート(') 
\"         // ダブルクォート(") 
\\         // バックスラッシュ(\) 
\$         // ドル記号($) 
\uFF00     // Unicode文字

文字列(String)

文字列はダブルクォート(")で囲む必要がある。上記のエスケープシーケンスも使用できる。

"ABC"

文字列では、$${...}を使って変数や式を書くことができる。

println("$a + $b = ${add(a, b)}")

"""..."""のように3つの引用符のリテラルで複数行文字列を表せる。改行やバックスラッシュは通常の文字として扱われる。

println("""\ is a backslash""")
println("""This is Korea.
That is America.""")

Any型(Any)

Anyはすべての型を表す。

fun foo(arg: Any?) {
    when (arg) {
        is Int -> println("Int: $arg")
        is Char -> println("Char: $arg")
        is String -> println("String: $arg")
    }
}

型変換

次のような型変換ができる。

123.toString()        // IntからStringへ変換 
"123".toInt()         // StringをIntへ変換 
"3.14".toInt()        // StringをIntへ変換(変換できない場合はnull) 
1.23.toInt()          // DoubleからIntへ変換(切り捨て) 
1.23.roundToInt()     // DoubleからIntへ変換(四捨五入)

レンジ(range)

..は範囲を表す。inは左側の値が右側に示された範囲内にあるかどうかを判断する。

for (i in 1..10) println(i)

1..101.rangeTo(10)と同じ意味を持つ。

for (i in 1..10) println(i)
for (i in 1.rangeTo(10)) println(i)

if文やwhile文で使用できる。

if (n in 1..10) println("OK")

範囲内にないことを確認するには!inを使用する。

if (n !in 1..10) println("Out of range.")

downToは減少する範囲を作る。stepは入力した分だけ増加する値を指定できる。

for (i in 10 downTo 1 step 2) println(i)

Int型のほか、文字(Char)、文字列(String)、実数(Double)などでも使用できる。

if ('b' in 'a'..'z') println("OK")
if ("gz" in "aa".."zz") println("OK")
if (1.23 in 0.00..9.99) println("OK")

RangeTutorial.kt

fun main(args: Array<String>) {
    println("==== if num1 in 4...8 ====")
    val num1 = 5
    if (num1 in 4..8) {
        println("$num1 in 4~8")
    }

    println("======= if num2 !in 4...8 =======")
    val num2 = 0;
    if (num2 !in 4..8) {
        println("$num2 not in 4~8")
    }

    println("========= for i in 1..7 =========")
    for (i in 1..7) {
        print("$i ")
    }
    println()

    println("====== for i in 1 until 7 ======")
    for (i in 1 until 7) {
        print("$i ")
    }
    println()

    println("====== for i in downTo 1 =======")
    for (i in 7 downTo 1) {
        print("$i ")
    }
    println()

    println("====== for i in 1..7 step 2 ======")
    for (i in 1..7 step 2) {
        print("$i ")
    }
}
==== if num1 in 4...8 ====
5 in 4~8
======= if num2 !in 4...8 =======
0 not in 4~8
========= for i in 1..7 =========
1 2 3 4 5 6 7 
====== for i in 1 until 7 ======
1 2 3 4 5 6 
====== for i in downTo 1 =======
7 6 5 4 3 2 1 
====== for i in 1..7 step 2 ======
1 3 5 7 

rangeは数値の範囲である。たとえば、1..5は1から5までの範囲を表す。 条件文でinを使ってrange式を使用すると、その範囲にある数値かどうかを確認できる。 if(number in 1..7)という構文がある場合、numberの値が1から7までの間にあればtrueである。 inの前に感嘆符(!)を付けると反対の演算になる。つまり、if(number !in 1..7)numberが1から7までの間にない場合にtrueになる。

for文で使用すると、数値の範囲を1つずつ取得できる。そのほかにuntildownTostepなどがある。

untilは、1 until 7であれば1から7の手前まで、つまり1〜6を表す。

downToは大きい数から小さい数へ減少する連続した値を取得できる。7..1のようにするとエラーが発生する。 stepは入力した分だけ増加する値を指定できる。

データ型の確認(is, !is)

isは左辺が右辺のデータ型と一致する場合にtrueであり、!isは一致しない場合にtrueである。サブクラスのインスタンスは親クラスに一致する。

println("ABC" is String)	// true
println("ABC" !is String)	// false

open class ClassA() {}
class ClassB(): ClassA() {}
var a = ClassA()
var b = ClassB()
println(a is ClassA)		// true
println(a is ClassB)		// false
println(b is ClassA)		// true
println(b is ClassB)		// true

whenを使って確認できる。

fun foo(a: Any) {
    when (a) {
        is String -> println("String")
        is Char -> println("Char")
        else -> println("Unknown")
    }
}

データ型の別名(typealias)

typealiasを使用して型に別名を付けることができる。

typealias Meter = Int
typealias Killometer = Int

キャスト(as, as?)

asは型をキャストするときに使用する。次の例では、String型ではない変数aStringに変換(キャスト)してsに代入している。キャストできない場合は例外が発生する。

var s : String = a as String

asを使用してスーパークラスをサブクラスへキャストできる。

open class ClassA(val name: String) {}
class ClassB(name: String): ClassA(name) {}
var obj1: ClassA = ClassB("Yamada")
var obj2: ClassB = obj1 as ClassB

キャスト元がnull許容型の場合は、asの代わりにas?を使用する。

var n1: Short? = 123
var n2: Int? = n1 as? Int?

dynamic型

Kotlinは基本的に静的型付け言語だが、JavaScriptへコンパイルするときはdynamicを使用して動的型付けができる。

var a : dynamic 
a = 123       // 数値を代入 
a = "ABC"     // 文字列を代入