Kotlin初学者用まとめ

# はじめに
WPFの案件からAndroidの案件に移動、しかも言語はKotlinでと言われて調べたり学んだ結果を残しておく。
C#からKotlinに移って興味深かった点や参考になったURLを記載する。

# Kotlin
Javaの代わりに注目されている言語。
NULL許容型などモダンな技術を取り入れている。
オブジェクト指向でありつつ関数型プログラミングの側面を持つ。

# コーディング規約
[Kotlin スタイルガイド  |  Android デベロッパー  |  Android Developers](https://developer.android.com/kotlin/style-guide?hl=ja)  
[コーディング規約 - Kotlin Programming Language](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/coding-conventions.html)  
[Various Android Coding Style2016 - Qiita](https://qiita.com/Reyurnible/items/c2c0f7150d338a49de86)  

# Kotlinのクラスについて調べたいとき
[kotlin - Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/)  

# さくっとKotlinを試したいとき
コンソール出力して値を確認したりできる。便利。
[Simplest version | Try Kotlin](https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt)  

# 文法
[Reference - Kotlin Programming Language](https://kotlinlang.org/docs/reference/)  
[リファレンス - Kotlin Programming Language](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/)  

## ローカル変数
基本的にReadonlyのvalを使用する。変更が必要な場合のみvarを使うこと
## 可視性
public以外は可視性を明記すること。可視性がないとpublicになってしまう

## 複数行の文字列
`"""`で囲むと複数行の文字列として扱うことが出来る。
文字列前の空白も文字列として扱われる。

```kotlin
"""aaa
  bbb
  CCC"""
```

## 文字列テンプレート
```kotlin
val who = "レイナサマ"
printf("祝・$[who}ボイス実装")
```

## null許容型
```kotlin
val a : Int = null // null非許容型なので例外が発生
val b : Int? = null // null許容型なので例外は発生しない
```

## when式
switch文の代わりに使われる。
in 範囲式で範囲を値として定義できる。

```kotlin
val a = 10
val result = when (a) {
 1 -> "1"
 in 2..5 -> "2から5まで"
 9,10 -> "9または10"
 else -> "その他"
}
println(result)
```
is演算子も値として定義できる。

```kotlin
val a: Any = 10
val result = when (a) {
 is Int -> 2 * a // is演算子を使えばIntにキャスト後のaが使える
 else -> 0
}
println(result)
```

式とあるので、戻り値を指定できる。ifもif式のため戻り値を指摘できる。
コードが見やすくなるので使っていきたい。

## Any
全てのクラスの親でJavaのObjectのスーパークラスにあたる。
ただし、`Any`でもnullは代入できない。代入できるようにするには`Any?`にしなければならない。
[Any - Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/)  
[JavaプログラマがKotlinでつまづきがちなところ - Qiita](https://qiita.com/koher/items/d9411a00986f14683a3f#any-%E3%81%A8-any)  

## リスト
読み取り専用は`listOf`関数
変更可能であれば`mutableListOf`関数を使う。
リストだけでなく、`map`等のコレクションは読み取り専用と変更可能な関数があるため、変更する必要のないものは読み取り専用を使うようにすると良さそう。

## 関数とラムダ式
### 暗黙の引数it
ラムダ式の引数が一つの場合に使える引数。

```kotlin
var getName: (String) ->String = { it + "さん" }
println(getName("小関"))
```
### 関数型
関数の引数を関数型しておけば、実行時に具体的な処理内容を決められる。

```kotlin
fun getName(name: String, f: (String) -> String) = f(name)
println(getName("小関", { it + "さん" }))
```
[Kotlin文法 - 関数とラムダ - Qiita](https://qiita.com/k5n/items/964d765767a65cc3de5b)  

## クラス
### lastinit修飾子
Kotlinでは、プロパティは全て初期化が必要だが、初期化を遅らせることが出来る。
null非許容型のプロパティの初期化を送らせたい時に使ったりする。

### コンストラクタ
プライマリーコンストラクタとセカンダリーコンストラクタがある。
プライマリーコンストラクタは、クラスで1つしか持てない。処理ブロックを持たないためinitブロックで処理を記載する。
セカンダリーコンストラクタは、複数持てる。処理ブロックを持つ。

[Kotlin - コンストラクタ - 覚えたら書く](https://blog.y-yuki.net/entry/2019/05/25/093000)  
[Kotlinの「セカンダリコンストラクタ」を理解をしてみる | とむじそブログ](https://bottoms-programming.com/archives/kotlin-secondary-constructor.html)  

## object宣言と式
`object`によるクラスの宣言は、シングルトンになる。
object式は、無名インナークラスを記述するときに使う。
`companion object`をメソッドに定義するとstaticメソッドと同様の振る舞いができる。
[オブジェクト式と宣言 - Kotlin Programming Language](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/object-declarations.html)  

## スコープ関数
変数のスコープを変更できるため、コードが読みやすくなる。
`with`、`apply`、`let`、`run`、`Pair`等がある。
`let`は、null許容型を扱いやすくなるためよく見る気がする。
[Kotlin スコープ関数 用途まとめ - Qiita](https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e)  

## 例外クラス
公式ドキュメント
[Exception - Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-exception/)  
公式による使い方まとめ
[Exceptions: try, catch, finally, throw, Nothing - Kotlin Programming Language](https://kotlinlang.org/docs/reference/exceptions.html)  
日本語で詳しく
[Kotlin - 例外処理 - 覚えたら書く](https://blog.y-yuki.net/entry/2019/05/08/233000)  
Javaと違ってtry-catchがなくても例外が投げれる(検索すると検査例外でも投げられるという説明はこのこと)