KotlinはAndroidアプリ開発に非常に適した言語です。これを学ぶモチベーションは実際にAndroinアプリ開発を行いたいということです。 もちろんJavaでも開発はできますが、なぜKotlinをあえて用いるのでしょうか。それはKotlinが「実用主義、簡潔、安全」を目指した言語だからです。 Javaよりもシンプルにコードを書くことができます。その上に、Javaとの相互互換性があるため、JavaのプログラムをKotlinで簡単に利用することもできるのです。 Javaについての説明は他のページで行っているので、是非そちらを見てください。ここではKotlinの主な特徴を見ていきたいと思います。 KotlinはJavaと同じくJVMで動作します。そのため、JavaとKotlinのソースファイルを自由に行き来することができます。また、KotlinはJavaと同じく静的型付けで、オブジェクト指向のプログラミング言語となります。 Kotlinでは先進的な関数プログラミングの機能も取り入れらています。安全性についてもJavaよりも担保されています。例えば、静的型付け言語として型の安全性が保証されています。他にも NullPointerExceptionをなくすためNullチェックが厳格になっています。このように、JavaとKotlinは兄弟関係のようなプログラミング言語ですが、KotlinはJavaをより簡潔にまとめたものであるという認識を 持てたと思います。
Kotlinの開発環境は今回REPLというものを使います。これは、Android Studio 3.0以降がインストールされていれば、使うことができます。 まずは、Android Studioをインストールすることをお勧めします。
開発環境が整ったらおなじみのHello World!を実行してみます。Javaでは文末にセミコロンが必要でしたが、Kotlinでは省略できます。
println("Hello World!")
実行結果
Hello World!
var 変数名:型=値
val 定数名:型=値
val multiline = """Oh
Hava a
nice Kotlin!"""
println(multiline)
val str = "64"
val intVal = str.toInt()
println(intVal)
実行結果
64
val str = "Kotlin"
val intVal = str.toInt()
println(intVal)
var text:String? = null
println(text)
実行結果
null
val arrayofInt:Array = arrayOf(1,2,3,4,5,6)
for(i in arrayofInt) print("$i,")
実行結果
1,2,3,4,5,6
if(条件式){
条件式がtrueの時に行う処理
}else{
}
val a=10
val b=20
val max = if(a>b){
print("a is greater than b")
a
}else{
print("b is greater than a")
b
}
print(max)
実行結果
a is greater than b
20
when(式){
値1 ->式の結果と値1が一致した場合の処理
値2 ->式の結果と値2が一致した場合の処理
else ->式の結果がどの値とも一致しない場合の処理
}
val a=100
when (a){
in 1..10 ->println("a is in the range")
!in 10..20 ->println("a is outside the range")
else ->println("otherwise")
}
val a:Any = "Kotlin"
when(a){
is Int->print(a*a)
is String->print(a.toUpperCase())
}
val a:Int? = null
val text = "Kotlin"
when{
a != null && text.startsWith("Kot")->println("starts with a prefix 'Kot'")
a == null && text.endsWith("lin")->println("ends with a suffix 'lin'")
else->println("otherwise")
}
val array = arrayOf(1,2,3,4,10,100)
for(a in array) print("$a,")
実行結果
1,2,3,4,10,100
val a = arrayOf(1,2,3,4,10,100)
for (i in a.indices){
print("a[$i]=${a[i]}")
}
実行結果
a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=10 a[5]=100
for (i in 1..4){
print(i)
}
実行結果
1234
for (i in 4 downTo 1){
print(i)
}
実行結果
4321
for (i in 0..9 step 2){
print(i)
}
実行結果
02468
var x=0
while(x<10){
print(x++)
}
実行結果
0123456789
var i=7
do{
print("i=${i--}")
}while(i>4)
実行結果
i=7 i=6 i=5
話は変わってコレクションというものについて説明します。複数の値をまとめて扱う機能をコレクションといいます。 Kotlinのコレクションでは、読み取り専用のコレクションと変更可能なコレクションの2つが用意されています。変更する必要がない場合は読み取り専用 のコレクションを使うことでバグを排除しコードを読みやすく保つことができます。 まず、リストについて説明します。リストは配列と同じように要素の順番を保持しますが、要素の重複が可能です。 読み取り専用リストの作成と初期化には、listOf関数を使い、変更可能なリストの作成と初期化にはmutabaleListOf関数を使います。
val items:List=listOf(1,2,3)
println(items)
println(items.get[0])
println(items[0])
println(items.size)
実行結果
123
1
1
3
val numbers:MutableList=mutableListOf(2,4,6)
println(numbers)
numbers.add(5)
println(numbers)
numbers.remove(4)
println(numbers)
実行結果
246
2465
265
var Strings:set=setOf("A","B","C")
println(set)
実行結果
[A,B,C]
var strings:Mutableset=mutableSetOf("A","B","C")
println(strings)
strings.add("y")
println(strings)
strings.remove("A")
println(strings)
実行結果
[A,B,C,y]
[B,C]
val fluits:Map=mapOf("apple" to 1,"orange" to 2,"banana" to 3)
print(fluits)
print(fluits.get["apple"])
print(fluits["orange"])
実行結果
(apple=1, orange=2, banana=3)
12
val fluits:MutableMap=mutableMapOf("apple" to 1,"orange" to 2,"banana" to 3)
print(fluits)
fluits.put("melon",4)
print(fluits)
fluits.remove("banana")
print(fluits)
実行結果
(apple=1, orange=2, banana=3)
(apple=1, orange=2, banana=3, melon=4)
(apple=1, orange=2, melon=4)
ここでは、Kotlinにおける関数の基本と、Kotlinが持つ関数型プログラミングの機能について説明していきます。 まず関数についてです。以下の例のように関数を定義します。
fun times(a:Int,b:Int):Int{
return a*b
}
times(2,5)
実行結果
res64: kotlin.Int = 10
fun printTimes(a:Int,b:Int):Unit{
print("$a multiplied by $b is ${a*b}")
}
printTimes(2,3)
実行結果
2 multiplied by 3 is 6
var minus={x:Int,y:Int->x-y}
minus(3,2)
実行結果
res66: kotlin.Int = 1
var double:(Int)->Int={it*2}
double(4)
実行結果
res67: kotlin.Int = 8
fun doLambda(x:Int,l:(Int)->Int)=l(x)
doLambda(5,{it*2})
実行結果
res68: kotlin.Int = 10
KotlinはJavaと強くかかわりがあるので、オブジェクト指向言語でもあります。そのため、クラスやインタフェースを使うことができます。 まずは、クラスの定義方法について説明していきます。Kotlinでは、「private」「protected」「internal」「public」の4つのアクセス修飾子が使われます。 Kotlinのクラスは、デフォルトでfinal(定数、継承禁止)扱いなので、そのままでは他のクラスを継承することができません。 継承させたい場合は、先頭にopenを記述します。また、インナークラス(クラスの中のクラス)を定義し、内側のクラスから外側のクラスにアクセスする場合にはinnerを先頭に記述する必要があります。 クラスのインスタンスを生成する場合は、コンストラクタを実行します。(Javaではnew演算子が必要ですが、Kotlinでは不要) また、インタフェースの定義はinterface インタフェース名(定義)のように記述します。 次に、プロパティについて説明します。クラスで保持したい値をプロパティとして用意します。これは、「セッター」「フィールド」「ゲッター」 の3つで構成されています。セッターは受け取ったデータをフィールドに保存し、ゲッターはデータをフィールドから取り出す役目をしています。 クラスの継承も行うことができます。Kotlinでは、クラスの継承はclass クラス名:親クラス名(引数)で行うことができます。 最後にインタフェースの実装方法を説明します。基本的にクラスの継承と同じです。同時にクラスの継承も行いたい場合は「,」カンマ で区切って並べます。また、Kotlinでは、インタフェースは抽象メソッドだけでなく、具体的なメソッドも定義可能です。 抽象メソッドをオーバーライド(継承先で処理内容を確定すること)際は、override修飾子が必要です。