初めてKotlinでAndroidアプリを開発する時に最低限知っておきたい書き方

#はじめに
この記事は[Android 初心者 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/android-beginner)の24日目の記事です。

初めて記事を書きます。
今までアウトプットすることが無かったのですが、
友人に誘われ良い機会だと思ったので書かせて頂くことにしました。

Android初心者ということで自分がKotlinでAndroidアプリを開発する上で、
当初Javaとの違いで調べた箇所などを書いていこうかと思います。
(何番煎じだよ…って感じですが)

「JavaでAndroidアプリの開発はしたことがあるけど、Kotlinでやってみたいな」
って方向けに書けたらなと思ってます。

最後に自分がKotlinでよく見る記事をまとめておこうと思います。
記事まとめだけを見たい方は[こちらへ](https://qiita.com/corleonis531/items/2ea87f7a6c9995d04c59#最後に)

#変数、定数
##宣言
Kotlinでは型推論が可能なので、型を省略して宣言することが出来ます。
### Java
``` 
int num = 1;
final String str = "文字列";
```
### Kotlin
``` 
var num = 1
val str = "文字列"

//明示的に型を指定する場合
var num: Int = 1

//nullを許容する場合
var num: Int? = null
```
##Kotlinにはstaticがない
Kotlinにはstaticが無いので、代わりに

- package-levelに書く
- companion object内に書く

これらの方法が使えます。

例.

``` SampleSub.kt
const val sub_str = "package-level" //package-levelに書く

class SampleSub{
    companion object {
        val num = 2 //companion objectに書く
    }
}
```
```Sample.kt
sub_str // -> "package-level"
SampleSub.num // -> 2
```
package-levelとcompanion objectについて考察している記事があるので良ければぜひ。
[companion object vs. top-level](https://hydrakecat.hatenablog.jp/entry/2017/12/02/companion_object_vs._top-level)

##関数オブジェクト
それとKotlinを触っていて驚いたことなんですが、

```Sample.kt
val function = { num1: Int, num2: Int ->
    var result = 0
    when{
        num1 > num2 -> result = 1
        num1 ==  num2 -> result = 0
        num1 < num2 -> result = -1
    }
    result
}

function(2,1) // -> 1
function(1,1) // -> 0
function(1,2) // -> -1
```
こんなことが出来るんですね。
Kotlinでは関数をオブジェクトとして扱うことが出来るから、みたいですね。

#Kotlinにswitchはない
Kotlinではswitchが無く、代わりにwhenが使えます。
##引数ありのwhen
```Sample.kt
when(num){
    0 -> //numが0だった時

    //ブロックにも出来る
    1,2 -> {
        //1と2が同じ処理の時は「,」で結合できる
    }
    in 3..5 -> {
        //numが範囲内だった時
    }
}
```
##引数なしのwhen
```Sample.kt
val resultWhen = when{
    num == 1 -> "num == 1"
    num != SampleSub.num -> "num != SampleSub.num"
    num in 0..2 -> "num in 0..2"
    else -> ""
}
```
whenを引数なしで使用した場合は、ifの様な感覚で使えます。
Kotlinではwhen、ifは式なので値を返すことが出来ます。
値を返すときはelseが必須になります。
{}(ブロック)を使用した場合は、ブロック内の最終行が返り値となる。

##ついでにif
```Sample.kt
val resultIf = if(num == 0) "num == 0" else "num != 0"
```
こんな感じで値を返せます。
ifが値を返せるのでKotlinでは三項演算子はないです。

# 継承、実装
次に、継承と実装の書き方の違いです。
それぞれのクラスに対して

- AppCompatActivityを継承
- View.OnClickListenerを実装

した時を例に見てみます。
##Java
```JavaActivity.java
public class JavaActivity extends AppCompatActivity implements View.OnClickListener {
```
##Kotlin
```KotlinActivity.kt
class KotlinActivity: AppCompatActivity(), View.OnClickListener {
```
また、継承なしで実装のみの場合は

```Sample.kt
class Sample: View.OnClickListener {
```
このようになります。

ちなみに、Kotlinではデフォルトでクラスは継承不可になっています。
Javaでいうfinal修飾子がついてる状態ですね。

継承可能にするためには、open修飾子を付けます。

```Sample.kt
open class Sample: View.OnClickListener {
```
#関数
Kotlinで関数は``fun 関数名(引数: 型):返り値の型``という風に記述します。
返り値が無しの場合は``void``ではなく、何も記述しません。

```Sample.kt
//引数、戻り値なし
fun Method(){}
```
```Sample.kt
//引数、戻り値あり
fun Method(num: Int): Int{ return num + 1 }
//上の関数はこうも書けます
fun Method(num: Int): Int = num + 1
```
関数がただ、値を返すだけの場合は、
``fun Method(num: Int): Int = num + 1``という風に記述することもできます。


# 最後に
ぱっと思いつくもので「Kotlinの書き方を知らないと…」と思うものをいくつか記述させていただきました。
その他や、詳細などは下で紹介している記事を参照お願い致します。
最後に僕がよく見る記事をここにまとめておきます。

- [Kotlin文法 - 基本](https://qiita.com/k5n/items/acfaff8b56faf57971f7)
- [30分で覚えるKotlin文法](https://qiita.com/k5n/items/cc0377b75d8537ef8a85)
- [【Kotlin】【Java】Kotlin Javaの比較メモ](https://qiita.com/farman0629/items/f959a4ff791f26b33fc3)
- [はじめてのKotlin。Javaと比較してみた](https://qiita.com/hituziando/items/fa2dc4097b24ab78276e)
- [Kotlin Reference](https://kotlinlang.org/docs/reference/)

最後まで読んでいただきありがとうございます。