Kotlinでクラスを書いてJavaで呼んでみる

去年Kotlinでコード書いたはずだ！とドキュメントを見てみるが、見覚えが無いなぁと思っていたら、去年書いたのはGoだった・・・乗り掛かった舟ということでKotlinを見てみました。

#開発環境はIntelliJ
KotlinのチュートリアルのGetting Startedで「Getting Started with IntelliJ IDEA」とIntelliJが1番に出てくるので流行っているのかな？コミュニティ版を[ダウンロード](https://www.jetbrains.com/ja-jp/idea/download/#section=windows)してインストールします。

![IntelliJ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/b7306322-8959-69cc-d9d3-7a5de7bbf4cd.png)

#Kotlinファイル作成＆実行
以前見たときよりダークなだけでカッコいい感じがするIntelliJ。
![intellij2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/b3267c41-c3ff-6437-2e95-acdd504ade69.png)
新規にプロジェクトを作って、Kotlinファイルを追加して実行してみるまでは[「Getting Started with IntelliJ IDEA」](https://kotlinlang.org/docs/tutorials/getting-started.html)通りにサクサクできる。

```
fun main() {
    println("Hello Kotlin!")
}
```

IntelliJインストール時になんとなく、そうかなぁと思いましたがKotlinのファイル拡張子「.kt」なんですね。（初心者）

.ktファイルを編集しているコードの左にRunボタンがあるのでクリックすると実行できる。IntelliJとても便利。
![kt_run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/d83592cd-990c-05e3-b57e-3597a3101596.png)

ファイル名がKotlinClassSono1.ktとなっていますが、Kotlinファイルってクラスファイルなのかと思ってました。

このmain関数をJavaからどうやって呼ぶのかな？ってことでJarファイルがいるだろうなぁ・・・IntelliJで「Build Project」を実行しても特に何も出力されないので調べてみました。

#Jarファイルを出力
FileメニューからProject Structureを開きます。
![project-structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/b95f018d-98cd-a075-6588-6decba355fff.png)
Project Settings＞Artifacts で「＋」ボタンをクリック JAR＞From modules with dependencies
![add-jar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/072cbd73-c85e-cb08-81c0-74408441a26e.png)
Main Class は指定しないで「OK」ボタンをクリック
![createjarfrommodule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/4ca3610a-0b19-69cb-59e2-c3b623638552.png)
「Include in project build」にチェックをします。
![includeinprojectbuild.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/03198afe-52c2-c236-ab06-fd53f2223f94.png)
もう一度「Build Project」を実行してみると・・・
プロジェクトフォルダー下にJarファイルが出力されてます。ありがとうIntelliJ
![outputdir.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/9cc83cf5-4cd5-0663-5c5e-f91c96135956.png)
ちなみにプロジェクト名は「KotlinComponent」になっています。
Jarファイルの中を覗いてみると
![jar1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/2101b97c-03c6-ef2a-2b34-96fa8640620f.png)
「ファイル名＋Kt」という名前の「KotilnClassSono1Kt.class」が含まれているのが確認できました。

#Javaから呼んでみる
Javaのプロジェクトで作成したJarファイルを読み込んでみると、

```
public class Main {
	public static void main(String[] args) {
		KotlinClassSono1Kt.main();
	}
}
```
KotlinClassSono1Ktが見えて、
![javaexec.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/c0fbf5fd-2290-e069-134f-80eda5ebde04.png)
JavaからKotlinのコードを実行できました。
クラス名にKtついてるし、なんだかなぁ~ということで、IntelliJに戻って追加でpackageとclassを追加してみました。
パッケージのsrcフォルダでコンテキスメニュー New＞Package でパッケージ作成。普通です。
作成したPackageでコンテキストメニュー New＞Kotlin File/Class !?
![newclass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/87af311a-4590-445f-6b82-f6b73b373d4c.png)
ここで初めてFileとClassの違いに気が付きました。

```
package ari

class KotlinClassSono2 {
}
```

Packageには「ari」を指定してます。
Kotlinの[Classのドキュメント](https://kotlinlang.org/docs/reference/classes.html)を真似してクラスに関数「test」を持たせてみます。コンストラクタはおまけです。

```
package ari

class KotlinClassSono2 constructor(name: String){
    init {
        println("name = ${name}")
    }

    constructor(name: String, age: Int) : this("$name"){
        println("age = ${age}")
    }

    fun test() {
        println("test call OK !")
    }
}
```

再度「Build Project」を実行してJarファイルを作成してJavaで読み込みます。
「ari」パッケージの下に「KotlinClassSono2」クラスが見えました。
クラス名に「Kt」が付いていません。なるほど~
![javacode.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/01134169-c424-b8ef-9f4b-6a29efb42e07.png)
コンストラクタを使ってインスタンスも作れました。
関数呼び出しも成功です。
![javaexec2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180278/b13c1a0f-2687-8406-19ed-73351d6105a5.png)
#最後に
Kotlinいいですね。
使わないんですけどreferenceをもう少し読んでみようかなぁと思いました。