Kotlin についてメモ(1)

初稿: 2019/7/10

メモ書き中です。 適宜修正・追記していきます。


Kotlin を始めるにあたって


Kotlinとは


  • 「ことりん」と読む

  • Kotlinとは、JVM(Java仮想マシン)で動作する言語。

  • JDKが必要

  • JVMで動作するようにコンパイルされる。

  • 動作するJDKのバージョンに影響を受ける(可能性がある)

  • ローカルマシンで動作検証するには、JDKのセットアップが必要


参考資料


Web

最初は存在を知っているくらいでいいと思います。


Spring Boot

power of Spring Boot and Kotlin.

Spring初学者が最初に知るべき責務とレイヤー


Wikipedia

Kotlin - Wikipedia


  • Kotlin言語は、Java言語をもっと簡潔・安全になるように改良した産業利用向け汎用言語として開発された。

  • オペレーティング・システムによらずJava仮想マシン上で動く。

  • Java言語で書かれたプログラムと同じほど速くコンパイルされ同じほど速く動作するとしている。

  • Java言語に望まれている機能であっても互換性を保つために実現できていない機能や、将来のJava言語の仕様で実現が予定されている機能から、有用と思われる機能を採用した。

  • Java仮想マシンで動く点で似ているスクリプト言語 Groovy や関数型プログラミング言語の要素が強い Scala から、機能や簡易記法(糖衣構文)を採用した。


  • ジェネリックの構文などでC#の影響を受けている部分もある。 List<T>など。


  • コトリン島にちなんで命名された。コトリンは、開発の地サンクトペテルブルクに近いバルト海フィンランド湾にあり、全長約12kmの細長い島である。


  • Kotlin/Native - Kotlin Programming Languageがある。


開発構築の構築

ローカル開発構築の構築について


JVMとJDK

まずはJVMとJDKについて知識があった方がよい。既知の場合には読み飛ばしてOK

気になる箇所を抜粋



  • ScalaやKotlinが生成したクラスファイルは新しいJVMでも(ほぼ)そのまま実行できる

  • ScalaやKotlinのコンパイラ、Apache GroovyやClojureのように実行時にコンパイルを行うものについては、新しいJDK上で動かすために改修が必要になる可能性がある


    • ただし、既存のプログラムをそのままコンパイルできるようにするだけなら、必要な変更は多くない





JDKの有料・無料・サポート等について

KotlinにはJDKが必要だが、Oracle版JDKは有料サポートとなった。

広く使われてきたOracle版からの代替えが必要となった。(※有料にしない場合)

気になる箇所を抜粋


個人的な意見としては、AWSによるベンダーロックインがJavaというアプリケーションの中核でも進んでしまうことの解釈が問題の焦点だと思います。今のAmazon Linux 2のように、CorrettoはAWSに限定して使われると思っています。



JDK のInstall について


Amazon Coretto の場合


AdpotOpenJDK の場合

HomebrewでAdpotOpenJDKをインストールする - Qiita


JDKのバージョン確認 (Mac)

今何が入ってたっけ?という時、

インストールされているJDKのバージョンを確認する

/usr/libexec/java_home -V

有効(アクティブ)なJDKのバージョンを確認するには以下

java -version


Javaの切り替え (Mac)

アクティブなJavaを切り替える。

AdpotOpenJDK → corretto11などの場合には以下を行う。

corretto11の場合、ターミナルで以下を実行する。

(バージョンに依存するので、実際の操作時には公式サイトを見る事)

export JAVA_HOME=/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home

これで切り替わらない場合、以下のように.bash_profileに追加する。

.bash_profileはログイン時に実行される。

vi .bash_profile

以下を追加
export JAVA_HOME=/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home


開発環境 IDEについて


IntelliJ IDEA

IDEはIntelliJ IDEA (インテリジェイ アイディア)を使う


IntelliJ IDEA (インテリジェイ アイディア) は、チェコに本社を置くJetBrains社が開発した、Javaなど数多くのプログラミング言語に対応した統合開発環境である。



Ultimate or Community ?

Commercial or 'Open-source, Apache 2.0'

どちらを使うか?

ダウンロードページのOpen-source, Apache 2.0の右側にカーソルあてると↓のように表示される。

スクリーンショット 2019-07-10 11.49.33.png


Community Edition is open-source, licensed under Apache 2.0. Projects like Android and Swift use Apache 2.0, so you’re in good company.

It can also be used for commercial development.



Community版の特徴


  • 対応言語がJava、Scala、Groovy、Clojure、KotlinなどのJavaプラットフォーム上の言語のみ。PHP、Python、Rubyなどは非対応。

  • Web系非対応。HTML、JavaScript、Webフレームワーク(Grailsなど)、Webサービスなどは非搭載

  • エンタープライズ系非対応。Java EE非対応。

  • データベース系非対応。SQL非対応、データベースツールを搭載しない。

  • UMLデザイナ非搭載

  • モバイル系はAndroidのみ対応。Adobe AIR非対応。

  • アジャイル開発系非対応。


IDEのインストール

インストールは特に迷う事が無いと思うので割愛


開発スタート

準備ができたところでKotlinに触れていきます。


Try it

さっそくIDEで開発を・・・の前に、まずはWeb上の実行環境でKotlinを試してみましょう。

以下にアクセスします。

https://try.kotlinlang.org/

まずは定番のHello, world!から。


Hello, world!

Hello, world! するサンプル | Try Kotlin

Run をぽちっと押すと、下のコンソールエリアに、Hello, world! と表示されます。このへんは特に説明は要らないと思います。

スクリーンショット 2019-07-10 14.51.25.png

mainの基本形はfun main(args: Array<String>)といったようにArray<String>の引数を受けますが、引数を使わない場合にはfun main()と省略も可能のようです。

fun main() {

println("Hello, world!")
}


引数をセットする

引数をセットするサンプル | Try Kotlin

引数(args)をセットしたい場合には以下の場所に入力します。

スクリーンショット 2019-07-10 14.56.03.png

argsに値が格納されるので以下のように使います。

argsが空の場合にはargs.sizeが0になっているので、それで判定します。

fun main(args: Array<String>) {

if (args.size == 0) {
println("Please provide a name as a command-line argument")
return
}
println("Hello, ${args[0]}!")
}

ちなみに、${args[0]}は「Stringテンプレート」という機能です。

文字列中に$(ドル記号)とともに変数や式を挿入する

string templatesの説明


引数を使う

複数の値が引数にセットされた場合の処理

引数を使うサンプル | Try Kotlin

argsがジェネリクスArray<String>になっているので、argsをforで回して使うサンプルです。

fun main(args: Array<String>) {

for (name in args)
println("Hello, $name!")
}

forEachで回す場合には以下のようになります。

fun main(args: Array<String>) {

//ラムダを使う場合
args.forEach{ element -> println("Hello, $element!") }

//ラムダを使わない場合には it が利用できる
args.forEach{ println("Hello, $it!") }
}


参考


オブジェクト志向的

オブジェクト志向的 Hello | Try Kotlin

class Greeter(val name: String) {

fun greet() {
println("Hello, ${name}");
}
}

fun main(args: Array<String>) {
Greeter(args[0]).greet()
}

これが読みにくい場合には以下だとわかりやすいかも?

fun main(args: Array<String>) {

var greeter = Greeter(args[0])
greeter.greet()
}

サンプルは他にもたくさんあるので、一通りやってみた方がよい


ローカル環境でのKotlin始め

主にバックエンドで使用する想定で進めていきます。


Rest API

Kotlin + Spring Boot でHello! World! - Qiita

Kotlin + Spring Boot + Swagger - Qiita

IntelliJ IDEA で JavaSDKを変更する - Qiita


Actuator

Spring Boot > Actuator - Qiita


Async (非同期処理)

Kotlin > @Asyn (非同期処理) - Qiita


コルーチン

実例によるkotlinx.coroutinesの手引き(日本語訳) - Qiita

kotlinx.coroutines はJetBrainsによって開発されたコルーチン用の豊富なライブラリです。

言語としてのKotlinは、他の様々なライブラリがコルーチンを利用できるようにするために標準ライブラリに最小限の低レベルAPIしか提供していません。

同様の機能を持つ他の多くの言語とは異なり、 async と await はKotlinのキーワードではなく、標準ライブラリの一部でもありません。


Test

Tutorial · Building web applications with Spring Boot and Kotlin

tasks.withType<Test> {

useJUnitPlatform()
}

dependencies {

...
testCompile("org.springframework.boot:spring-boot-starter-test") {
exclude(module = "junit")
}
testImplementation("org.junit.jupiter:junit-jupiter-api")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
testImplementation("com.ninja-squad:springmockk:1.1.2")
...
}


参考等

What's Good About Kotlin in Android Development - Shiraji's Blog