Kotlin - 自習ノート

# はじめに

職場でKotlinを使ってみようという流れになったので、この年末年始休暇中から勉強を始めました。Googleで探せば直ぐに知りたいことが見つかりますが、読み始めた『アウトプット大全』に学習効率はアウトプットすることで高まると書いていたので、勉強したことを、まとめる事にしました。

# Kotlin環境構築

Macユーザーなので、Homebrewでインストール。

```bash
$ brew update
$ brew install kotlin
```

インストールしたくない人は、Try KotlinというサイトでもKotlinを体験できます。
http://try.kotl.in

統合開発環境で IntelliJ IDEA があり Kotlin開発では、Community版を使えば良さそう。
http://www.jetbrains.com/idea/download/

# HelloWorld

まずは、基本のHelloWorld!

```bash
# プログラム作成
$ vi HelloWorld.kt
/* 初めてのプログラム */
package sample

fun main(args: Array<String>) {
    println("Hello, world!")
} 

# コンパイル
$ kotlinc HelloWorld.kt -include-runtime -d HelloWorld.jar

# 実行
$ java -jar HelloWorld.jar
Hello, world!
```
## REPL(read-eval-print loop)モード
ファイル指定しないで kotlinc を実行すると対話型評価環境REPLモードが起動。
コードを入力してEnterキーを実行するとコードが評価される。
変数を打つと値が出力するので、簡単なコードの確認に使えそう。
以降は、REPLでサンプルを書きます。

```kotlin
$ kotlinc
Welcome to Kotlin version 1.3.11 (JRE 10.0.1+10)
Type :help for help, :quit for quit
>>> var x=1
>>> x
1
>>> :quit
```


# 文法

JVMで動くだけあって、Javaと同じ文法がありました。
他のJVM上で動く言語もそうなのだろうか？！

**Javaと同じもの**

+ コメント（行コメント、複数行コメント）
+ main関数がプログラムのエントリポイント

**Javaと異なるもの**

+ データ型定義が後ろ
+ 文末はセミコロンではなく改行
+ データ型
 + Javaのプリミティブ型がなく、ラッパークラスが基本データ型
 + 整数は略語のIntが使われていた
+ 関数の書き方
 + 「fun」でした。「function」ではなく
+ クラス定義なくても大丈夫みたい

## データ型

| 型 | 種類 |
|:--|:--|
| Double | 浮動小数点 |
| Float | 浮動小数点 |
| Long | 整数 |
| Int | 整数 |
| Short | 整数 |
| Byte | 整数 |
| Boolean | 真偽値 |
| Char | 文字 |
| String | 文字列 |

配列は **Array** クラスが用意されている。

``` kotlin
>>> var lists: Array<String> = arrayOf("hello", "world")
>>> lists[0]
hello
>>> lists[1]
world
>>> 
```

データ型毎のクラスも用意されている。

```kotlin
>>> var ints: Array<Int> = arrayOf(1, 2, 3)
>>> ints[0]
1
>>> var ints: IntArray = intArrayOf(1, 2, 3)
>>> ints[0]
1
>>> 
```

## 変数

**val** は固定値(immutable)

```kotlin
>>> val x: Int = 1
>>> x = 2
error: val cannot be reassigned
x = 2
^

>>> 
```

**var** は可変値(mutable)

```kotlin
>>> var y: Int = 1
>>> y = 2
>>> 
```

型は省略可能

```kotlin
>>> var z = 1
>>> z
1
```

## 条件分岐

### if文

```kotlin
>>> var x = 1
>>> var y = if (x == 1) "TRUE" else "FALSE"
>>> y
TRUE
>>> 

```

### when文

```kotlin
>>> val result = when(3) {
... in 1..3 -> "one to three"
... else -> "others"
... }
>>> result
one to three
>>> 
```

## ループ

### while文

```kotlin
>>> var x = 1
>>> var x = 3
>>> while (0 < x--) {
... println("hoge")
... }
hoge
hoge
hoge

>>> var y = 0
>>> do {
... println("fuga")
... y++
... } while (y < 3)
fuga
fuga
fuga
>>> 
```

### for文

```kotlin
>>> for(i in listOf(1, 2, 3)){
... println("i = $i")
... }
i = 1
i = 2
i = 3
>>

>>> for(i in 5 downTo 1 step 2) {
... println("i = $i")
... }
i = 5
i = 3
i = 1
>>>
```

### 関数

```kotlin
// 単一行
fun 関数名(第1引数名: 型, 第2引数名: 型, ...): 戻り値の型　= 式

// 複数行
fun 関数名(第1引数名: 型, 第2引数名: 型, ...): 戻り値の型　{
  // コード
}
```

```kotlin
>>> fun square(n: Int): Int = n * n
>>> square(3)
9

>>> fun add(a: Int, b: Int): Int = a + b
>>> add(2, 7)
9
>>>
```

関数には**名前付き引数**という仕組みがあり、引数の順番ではなく名前で引数が指定可能

```kotlin
>>> fun foo(a: Char, b: Char) {
... println("1: $a, 2: $b")
... }
>>> foo('X', 'Y')
1: X, 2: Y
>>> foo('Y', 'X')
1: Y, 2: X
>>> foo(a = 'X', b = 'Y')
1: X, 2: Y
>>> foo(b = 'Y', a = 'X')
1: X, 2: Y
>>> 
```

PHPのように***デフォルト引数***があります。

```kotlin
>>> fun hello(name: String = "World") {
... println("Hello, $name!")
... }
>>> hello()
Hello, World!
>>> hello("Japan")
Hello, Japan!
>>> 
```

# えら

# 最後に

Kotlinの [リファレンス](](http://dogwood008.github.io/kotlin-web-site-ja/docs/reference/)) があるのを見つけました。
後は、このサイトを見て勉強を続けることにします。


# References

+ 『Kotlin Webアプリケーション』 長澤太郎 著
+ [Working with the Command Line Compiler](https://kotlinlang.org/docs/tutorials/command-line.html)
+ [リファレンス - Kotlin Programming Language](http://dogwood008.github.io/kotlin-web-site-ja/docs/reference/)