Kotlinって何？って人向けの解説


最近巷で話題のKotlin、名前を聞いたけど一体どんな言語なのか？そもそもKotlinなんて名前も聞いたこともないし触ったこともない方向けに自分の勉強含め、解説していきたいと思います。

## Kotlinとは？
KotlinはJetBrains社によって開発された`静的型付けオブジェクト指向プログラミング言語`。2011年に`Project Kotlin`を発表、翌年の2月にApache2 licenseをもとにオープンソース化されました。名前の由来はロシア領の[コトリン島](https://goo.gl/maps/T4zC2pSM1MwXKrr7A)。

### 言語の特徴

* JVMで動作し、Javaで書かれたプログラミングとほぼ変わらない速度でコンパイルできる
* [Null safety (NULL安全)](https://kotlinlang.org/docs/null-safety.html)
* Javaとの相互運用ができる（Javaのクラスを呼び出したり、KotlinのクラスをJavaで呼び出すことができる）
* Javaより簡潔に記述できる

言語仕様がかなりJavaと似ているところがあるため、Javaプログラマであれば少しの時間であまり違和感なく使えるのではないのでしょうか。私も実際にJavaを習得していて、ある程度Kotlinのリファレンスを流し読みしただけでもすぐにAndroid開発でほぼ不自由なく使用することができました。

また、Javaほどコードが複雑にならない、`Null safety`の恩恵でJavaエンジニアをよく苦しめる`NullPointerException`を防ぐことができます。それらのことから、**Javaよりも学習コストが低く、Javaを取得していないエンジニアでも比較的学びやすい言語です**。

### 開発環境について

Kotlin単体で使用したいなら**IntelliJ IDEA** + 推しのJDK、Android端末などで使用したいなら**Android Studio**の使用を推奨します。どちらもエディタはJetBrains社のIntelliJ IDEAを使用しており、かなり強力です。機能としては、

* JavaのコードをKotlinファイルにコピペするとKotolinに変換できる
* 文脈などを考慮した[スマート保管](https://pleiades.io/help/idea/auto-completing-code.html#postfix_completion)
* 文法チェックと充実したリファクタリング
* 見やすいシンタックスハイライト
* dockerやGitHubとの連携　等々...

IntelliJ IDEAは有料版もありますが、Kotlin言語単体での開発であればほぼ問題ないと思います。

JDKに関しては最新であれば基本どのJDKでも大丈夫です。
上記のほかにもコマンドラインで実行環境を構築し、Visal Studio Codeで開発することも可能です。
また、[web上での実行ツール](https://kotlinlang.org/)もあり、簡単に試すことが可能です。


## Kotlinで主にできること

Javaでできることは基本的に何でもできます。その中で主に使われる用途について軽く説明したいと思います。

### Android
Android開発がKotlinを使う機会が一番多いのではないかと思われます。
Kotlinは2017年にAndroidの公式言語になっており、急速に開発者の人気を集めていきました。
現在、`60%以上`のAndroid開発者がKotlinを採用しており、2019年にGoogleがGoogle I/O 2019 にて「[Kotlinファースト](https://developer.android.com/kotlin/first?hl=ja#what)」をさらに強化していくということで、その取り組みをしていきました。

例えば、

* 実装をさらに簡潔かつ快適に書けるようになるAndroidXのKotolin固有のAPI([KTX](https://developer.android.com/kotlin/ktx?hl=ja)、[コルーチン](https://developer.android.com/kotlin/coroutines?hl=ja)など)の対応
* サンプルが優先して提示される
* Androidアプリケーション開発を支援する「Android Jetpack」の最新バージョンでの優先した提供
* [マルチプラットフォームプロジェクトの対応 (alpha版)](https://kotlinlang.org/lp/mobile/) 等々...


Java プログラミング言語からの API の使用もサポートしつつ、Kotlin ユーザーを念頭において設計されているようです。

#### Kotlin+Androidはどのくらい簡潔に書けるのか

簡単なデータを保存しておきたいときによく使用される[SharedPreferences](https://developer.android.com/training/data-storage/shared-preferences?hl=ja)の比較ですが

Javaのみで記述した場合

```java:Sample.java
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); //Preferencesの取得
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score_key), newHighScore);
editor.commit();
```


KTX + Kotlinで記述した場合

```kotlin:Sample.kt
val pref:SharedPreferences =  getPreferences(Context.MODE_PRIVATE) //Preferencesの取得
pref.edit(commit = true){ 
    putInt(getString(R.string.saved_high_score_key), newHighScore)
}
```

このようにKTX + Kotlinで記述すると、Javaよりも簡潔にわかりやすく自然に記述することができます。
実際に書きやすく、コードを見直した時もどのような処理だったかも分かりやすいため、Android個人的にお勧めします。
また、Android developersでの[Kotlinのスタートガイド](https://developer.android.com/kotlin)がかなり充実しており、初学者でもかなり手に付けやすい環境になっております。
もう一つの利点として、冒頭でJavaとの相互運用できると言ったように、Kotlinがサポートされる前の古い端末でも**AndroidAPIのバージョンが合えば使用できます**。


### サーバーサイド
サーバーサイドではSpring frameworkが主に使用されています。
Springは再利用性が高く、大規模なサーバー構築などに用いられていきました。
Springのほかに[Ktor](https://jp.ktor.work/)などの非同期Webフレームワークも存在します

##### 導入方法
[Spring Initializr](https://start.spring.io/)でテンプレートプロジェクトを作成できます。自動生成されたプロジェクトをIntelliJ IDEAで読み込むと簡単に実行可能になります。


### その他


* [KotlinDL](https://github.com/jetbrains/kotlindlKotlin)　Deep Learningができる。モデルの作成は非対応だったはず。
* [Kotlin for JavaScript](https://kotlinlang.org/docs/js-overview.html) KotlinをJavaScriptに変換できる

## Hello World

```kotlin:Hello.kt
fun main(string: Array<String>){
    println("Hello World Kotlin!!")
}
```

MainClassを作る必要はないです。`fun`や`class`に修飾子がついていない場合は暗黙的にpublicになります。
mainの引数はコマンドライン引数。Javaは`System.out.println`まで必要でしたがKotlinは`println`だけで簡単に出力ができます。

### 文法
記述予定