
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修飾子が必要です。