Kotlinのこと

[SLP KBIT Advent Calendar 2017 12/17(Sun) の記事です。](https://adventar.org/calendars/2492)

# はじめに
どうも香川大学 学生プログラミング 研究所 SLP 学部3年のNya-chan(itakumi)です。
最近自分の中で Kotlin ブームがきているので 1, 2年生とかも興味を持ってくれるようにみんなよく知っているであろうJava との比較で Kotlin はどんな旨味があるのか書きたいと思います。
このカレンダー唯一無二の Kotlin です。
たまには全然レベルの高くないただの言語紹介記事でも見て癒されてください。

# まずはKotlinについて
まず具体的な構文の話とかをする前にKotlinってなんやねんという人もいると思います。
Kotlinとはジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、静的型付けのオブジェクト指向言語です。
ロゴは下のやつです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152005/dd708ea4-458d-72a8-7b28-7cc48696e0c2.png)

このジェットブレインズ社は有名のだと IntelliJ IDEA とか RubyMine とかプログラミング言語の開発環境を開発している会社ですね。
Kotlin はジェットブレインズ社の経験をもとにJava言語をさらに簡潔で安全になるように改良した言語です。
なのでKotlinはJava仮想マシン(以後JVM)上で動く、いわゆるJVM系言語って言われるやつですね。
昨日の灰色熊さんが書いたScalaもJVM系言語ですね。
まぁ最初の説明はこれくらいにして次からは具体的な構文について見ていきたいと思います。

# 構文について
## Hello World
みなさんプログラム言語を初めて触る時最初に作るプログラムは何でしょうか？？？？
そう！！ **HelloWorld** ですね。
上がJavaのHelloWorldプログラムで下がKotlinです。

```java:HelloWorld.java
public class Hello {
  public static void main(String[] args) {
    System.out.println("Hello, world!");
  }
}
```

```kotlin:HelloWorld.kt
fun main(args: Array<String>) {
    println("Hello, world!")
}
```

は？めっちゃ短い!!!
そうKotlinすごく短い。てかJavaが長い。
KotlinはJavaに比べてかなりスッキリ書くことができます。
あと文の最後にセミコロンを必要としません。
ジェットブレインズ社の人たちもセミコロンよく忘れたのかな？？
クラスの書き方も fun 関数名(変数名:型名) などで定義することができます。
System.out.printlnもprintlnだけでOK!!

## 変数の扱い方
次は変数です。基本的にはこのような構文になります。

```kotlin
val num = 10    // val だと変更不可
var i = 10      // var だと変更可能
i = 20
```

また、型を明示的に指定したいときは、

```kotlin
val str: String = "熱盛"    // 失礼しました熱盛と出てしまいました
```

のようにします。
最初のうちは　val と var がごっちゃになるかもしれないですが慣れれば問題ナッシングです。

まぁ基本的な構文をつらつらと書いてもいいのですが、長くなっちゃうのでその他は興味があれば調べてみてください。

# Nullable
じゃあ構文とかは Java より簡潔だし理解しやすいけどそれだけなん？ってことで Java はないけど Kotlin にあるものも紹介します。
Javaでなにか開発をしている人が必ず出会うだろう NullPointerException と言うのがありますよね。
よくﾇﾙﾎﾟﾇﾙﾎﾟ言われるやつです。
Kotlin には NullPointerException を撲滅しよう運動という運動があります(嘘)。
Kotlin は Nullable という特別な型によって初めて null を代入できます。
これによって NullPointerException　を防ぐことができます。
具体的な書き方は以下のようになります。

```kotlin
// 普通のString型はnullを代入できない
var str1: String = "ばなな"
str1 = null    // コンパイルエラー
val len1 = str1.length    // これは大丈夫。str1は絶対にnullを代入できないのでヌルポにはならない

// Nullableにしてみた
var str2: String? = "バジリスクタイム"
str2 = null    // コンパイルエラーにならない
val len2 = str2.length    // コンパイルエラー!! ヌルポになっちゃう--って言われる

// こんな書き方もできる
val len2 = str2?.length    // こうするとnullじゃなければ実行、そうじゃなければnullを返す
val len2 = b?.length ?: -1    // エルビス演算子でnullによる条件分岐も簡単にできる
```
これを使えば Kotlin ではヌルポを防ぐことができるといいましたが、現行で Kotlin だけで動いているシステムは少ないと思います。
だいたいはもとの Java で作られたシステムに機能を追加するときに Kotlin を使うという感じですね。
なので Kotlin で書いてあるからといって Java が関わってくるとヌルポが起きます。
Kotlin で書いたからヌルポが無いと言う訳ではないところに注意したいですね。

# 何か作ってみよう
前作った Android のストップウォッチアプリのコードを晒します。
オブジェクト指向とか全く考えてないクソコードですが。
詳しい説明は今後気が向いたらどこかに。。。

```kotlin

class MainActivity : AppCompatActivity() {

    val handler = Handler()
    var timeValue = 0


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val timeText = findViewById<TextView>(R.id.timeText)
        val startButton = findViewById<Button>(R.id.start)
        val stopButton = findViewById<Button>(R.id.stop)
        val resetButton = findViewById<Button>(R.id.reset)

        val runnable = object : Runnable {
            override fun run() {
                timeValue++

                timeToText(timeValue)?.let {
                    timeText.text = it
                }
                handler.postDelayed(this, 1000)
            }
        }

        startButton.setOnClickListener {
            handler.post(runnable)
        }

        stopButton.setOnClickListener {
            handler.removeCallbacks(runnable)
        }

        resetButton.setOnClickListener {
            handler.removeCallbacks(runnable)
            timeValue = 0
            timeToText()?.let {
                timeText.text = it
            }
        }
    }


    private fun timeToText(time: Int = 0): String? {
        return if (time < 0) {
            null
        } else if (time == 0) {
            "00:00:00"
        } else {
            val h = time / 3600
            val m = time % 3600 / 60
            val s = time % 60
            "%1$02d:%2$02d:%3$02d".format(h, m, s)
        }
    }
}

```

わーい動いたーー！！！

![スクリーンショット 2017-12-15 11.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/152005/2465690d-0819-d313-64f4-424779ee5db9.png)

# まとめ
今回 Kotlin について記事を書きましたが自分もまだまだ学習が必要ですね。
結構調べてみて知らないことがたくさん出てきました。
興味を持った人一緒に勉強しましょう！！
あと Aqours のファンミーティング楽しみ！！
福岡と幕張に行きまする！！三└(┐卍^o^)卍ドゥルルル


# 余談
一番新しい Android Studio に**「Include Kotlin support」**が、追加されて嬉しい。
最初の前準備がしゅごい楽になるぞ。