Kotlin について調べたこと

# Kotlin について調べたこと

## kotlinとは

Kotlinは、IntelliJ IDEAで有名なJetBrainsが開発したオブジェクト指向プログラミング言語です。
コンパイルされたコードはJVM上で動作するため、
これまでJAVAで作成した資産を流用できる様になっています。

## Kotlinの基本構文

### 変数宣言

```kotlin
// val で宣言すると値の再代入ができなくなる  
val firstName: String = "Tanaka"  
// 型推論でいちいち型の定義がいらない  
val lastName = "Taro"  
  
// var で宣言すると再代入ができる  
var age = 20  
age = 21
```

### 配列

```kotlin
// 配列(array)を作成  
val nameList: Array<String> = arrayOf("tanaka", "saitou", "kimura")  
println(nameList[0]) // tanaka が出力  
  
// 配列の要素の書き換え  
nameList[1] = "sakurai"  
println(nameList[1]) // sakurai が出力  
  
// 配列(リスト)を作成  
val animalList: List<String> = listOf("dog", "cat", "rabbit")  
println(animalList[0]) // dog が出力  
  
// 配列の要素の書き換え  
animalList[1] = "tiger" // エラー インターフェイスListは読み取り専用
```

List でも mutableListOf() で変更可能なリストができるので Array と List の使い分けがいまいちわからないです。

### マップ

```kotlin
// マップ作成  
val numberMap: MutableMap<String, Int> = mutableMapOf("one" to 1)  
println(numberMap["one"]) // 1 が出力  
//// 値の追加  
numberMap["tow"] = 2  
println(numberMap)        // {one=1, tow=2} が出力  
  
// mapOf でマップ作成  
val reNumberMap: Map<Int, String> = mapOf(1 to "one")  
println(reNumberMap[1])   // 1 が出力  
//// 値の追加  
reNumberMap["tow"] = 2    // エラー mapOf は 読み取り専用
```

### 条件分岐

```Kotlin
// 普通のif文  
if (true) {  
    println("if")   // if が出力  
} else {  
    println("else")  
}  
  
// Kotlinに三項演算子はないのでそれっぽいの  
val animal = "dog"  
val isDog = if (animal == "dog") true else false  
println(isDog)      // true が出力  
  
// 空チェックとかなら  
val person:String? = null  
val personName = person?: "NoName"  
println(personName) // NoName が出力  
  
// when文 switch文と同じような感じ  
val result = when("hoge") {  
    "hoge" -> "hoge"  
    "fuga" -> "fuga"  
     else -> "else"  
}  
println(result)     // hoge が出力
```

### ループ処理

```kotlin
// while 文  
var count = 5  
while(0 < count--) {  
    println("while count: ${count}")  
}  
  
// for 文  
for (i in 1..5) {  
    println("for count: ${i}")  
}
```

## JAVA と Kotlin の書き比べ

userクラスに年齢、名前、性別を加え、
自己紹介メソッドを実行するコードを書いてみました。

### Kotlin

user.kt

```kotlin
fun main() {  
    val user = userData(20, "Taro", "Men")  
    user.selfIntroduction()  
}
```

userData.kt

```kotlin
data class userData (  
    var age: Int? = 0,  
    var name: String = "NoName",  
    var gender: String? = null  
) {  
    fun selfIntroduction() {  
        println("My name is ${name}")  
        println("Age is ${age}")  
        println("Gender is ${gender}")  
    }  
}
```

### JAVA

user.java

```java
public class user {  
    public static void main(String[] args) {  
        userData user = new userData(20, "Taro", "Men");  
        user.selfIntroduction();  
    }  
}
```

userData.java

```java
public class userData {  
    private int age;  
    private String name;  
    private String gender;  
  
    public userData(int age, String name, String gender) {  
        this.age = age;  
        this.name = name;  
        this.gender = gender;  
    }  
  
    public void selfIntroduction() {  
        System.out.println("My name is " + this.name);  
        System.out.println("Age is " + this.age);  
        System.out.println("Gender is " + this.gender);  
    }  
}
```

記述して感じた違いとしては

* コンストラクタの作成に New がいらない
* 型推論の機能により必ず型の定義をする必要がない
* 末尾のセミコロンが必須ではない
* 文字列リテラルの中に式を入れることができる

## Spring Boot で Hello World

### 環境
Windows10 Pro
IntelliJ Community Edition 2020.2
JAVA 14

### プロジェクトの雛形を作る

[Spring Initializr](https://start.spring.io/) を用いてプロジェクトの雛形を入手する。

設定は
**Project** : Gradle Project
**Language** : Kotlin
**Spring Boot** : 2.3.4
**Project Metadata** : デフォルトのまま
**Packaging** Jar
**Java** : 14
**Dependencies** : Spring Web

![chrome_8cN8PNZDsH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/1a97eee0-0961-de5c-b7c1-304699d71fa1.png)

最後に、**GENERATE** を押下してプロジェクトの雛形をダウンロード

### 作成したプロジェクトの雛形をビルド

IntelliJ から **File→Open...→ダウンロードしたプロジェクトの雛形を選択→OK** の手順で展開

### コントローラを作成

`demo/src/main/kotlin/com.example.demo/controller` フォルダーに対して
**右クリック→New→Kotlin File/Class** を押下
HelloController.kt を作成する。

HelloController.kt

```Kotlin
package com.example.demo.controller

import org.springframework.web.bind.annotation.RestController
import org.springframework.web.bind.annotation.RequestMapping

@RestController
public class HelloController {
    @RequestMapping("/")
    fun hello():String {
        return "Hello World"
    }
}
```

### Webサーバの起動

![idea64_VFRC5iORoS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/831b830e-ce7c-f89c-ab04-bbf3baa9242f.png)

右上の **再生ボタン** を押下し、ビルドを行う

### 接続

ビルドが終わったら `http://localhost:8080` に接続

![chrome_Dk8vUW6lcC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418022/7d4ba46d-3b47-0edf-b62f-cf3a0eea2f13.png)


## 感想

筆者はJAVAをあまり触ったことが無いので、
JAVAを知らないでいきなりKotlinって大丈夫なのかなと不安を感じていたのですが、
いきなりKotlinから書き始めてみたところ、いきなりKotlinでも問題なく
むしろKotlinから始めたほうがとっつきやすいと感じました。
JAVAと書き比べてみたところ、Kotlinでのコード量が少なくなり、
型推論やデータクラス等がコードを簡潔の手助けになっていると感じました。