Kotlinの認知度を高めたい



# お知らせ
こんにちは、愛知工業大学システム工学研究会です。
この記事は、2021-04-12に書かれた記事です。
間違った内容や古い内容が紛れていますが、過去の記事を残す一環として記事を書きます。
よろしくおねがいします。

# Kotlinの認知度を高めたい

* はじめに
* Kotlinってなんぞ？
* HelloWorld
* おわりに

## はじめに

この記事はシス研アベントカレンダー　6日目の参加記事です。

今回の記事は、**Kotlin**というプログラミング言語についての軽い説明を書きました。
こんなコードでこんな感じのすごそうなプログラミング、を紹介するわけではなく、「**Kotlinなにそれおいしいの？**」という人に向けの内容になっています。なので物足りない人もいるかと思いますがご容赦ください。

## Kotlinってなんぞ？

Kotlinを一言で表すとするならば「**進化系Java**」です。
KotlinはJavaの**不便な部分**、**面倒な部分**を改良し色々な機能をつけた静的型付けオブジェクト指向プログラミング
言語として開発されました。Javaとの**完全な互換性**ももち、まさにJavaの後継と言えるでしょう。Java仮想マシン上で動くことからもJavaを意識して作られたことがわかります。
提供元はソフトウェア開発企業のJetBrainsで、2012年にオープンソース化された比較的新しいプログラミング言語です。

## HelloWorld

さっそくみんな大好きHelloWorldでJavaとKotlinの違いを見ていきましょう。

```
Kotlin fun main(args: Array){ var a = "HelloWorld" println(a) }
```

```
Java public class Main { public static void main(String[] args) { String a = "HelloWorld"; System.out.println(a); } }
```

流石にHelloWorldを直で表示するのは味気ないので変数に代入して表示するコードにしました。
 一つ目のコードがKotlinで二つ目がJavaです。
 これだけでもJavaとKotlinの違いがかなり見えてきますね。JavaよりもKotlinの方が**簡潔**に書かれていることがわかると思います。

JavaとKotlinの差を雰囲気で理解したところで一行づつ比較しながら詳しい説明をしてきましょう。

### クラスと関数の扱い

まずはmainメソッドの宣言からです。

```
Kotlin fun main(args: Array){
```

```
Java public class Main { public static void main(String[] args) {
```

一目でわかる大きな違いは**クラスの有無**と**修飾子**(publicやstaticのこと)の差ですね。
 KotlinはJavaとは違い**クラスを作成することなく関数の定義を行う**ことができます。たった一つのメソッドのためにわざわざクラスを作らずとも直接関数を定義、実装ができるということです。Javaの場合、メソッドは必ずクラスに属していなければなりませんでした。
 もちろんJava同様クラスを作成して運用することもできるので、状況と必要性によって使い分けましょう。

そしてKotlinでは、Javaのように長ったらしく「おまじない(修飾子)」を記述する必要はありません。クラスは「class」、関数は「fun」 と記述するだけで基本的には宣言が完了します。
 なぜそれだけで済むかというと、Kotlinではデフォルトとして設定されたJavaの「おまじない」が存在しているためです。アクセス修飾子を記述しない場合は自動で「public」として扱ってくれます。そして「static」はそもそもKolinには存在していない(似たような機能は存在しますがめんどくさくなるので割愛)ため、不要というわけです。コーディングの作業量が減っていいですね。
 ちなみに、戻り値なしを意味するjavaのvoidもKotlinではデフォルトで設定されているため記述は不要です。もし記述したい場合は以下のようになります。

```
Kotlin fun main(args:Array): Unit{
```

Unitがvoidと同等の役割を持っています。

### 変数の扱い

次はString型変数aの宣言と値の代入です。

```
Kotlin var a = "HelloWorld"
```

```
Java String a = "HelloWorld";
```

なんか色々違いますね。一つづつ見ていきましょう。

初めにvarからです。二つのコードを見比べると「varでString型の宣言をしているのかな」と勘違いしてしまいそうですがそうではありません。ではvarは一体なにものなのかというと、**変数の性質を定義するキーワード**です。すごそうですね。
 実際はそう難しいことではなく、ただ「**この変数は値の再代入が可能です**」と定義しているだけです。イメージとしてはJavaScriptのvarやletなどと同じです。そしてキーワードにはもう一つ、valというものがあります。valはvarの逆で、「**変数への値の再代入の禁止**」を定義しています。初期値から変更ができなくなるため、参照用の変数など値を変える必要がない場合にvalを使用します。変数の値が変わることがなくなるため、デバッグ時などに値の変化を追う手間が省けるので何気に便利です。
 変数の宣言には**varかvalでの定義が必ず必要**になるので気をつけましょう。

それではStringは一体どこに行ったのでしょうか。
 これにはKotlinの**型推論**と呼ばれる機能が関係しています。この機能は型の宣言をせずとも変数に代入された値から変数の型を推測し、**自動で型を定義してくれる**というものです。
 つまりKotlinでは型の宣言はしなくても基本的には問題ない(変数宣言時に値を代入しない場合や、数字を代入するけどあえて別の型で使いたい場合は型の記述は必要)ということです。なのですが、パッと見た時変数の型がわからなくことがあるので扱う変数が多くなる場合は型の記述をしたりします。
 型を記述する場合は以下のようになります。

```
Kotlin var a: String = "HelloWorld"
```

「:」を忘れないようにしましょう。

そしてこの行最後の説明は、行末に「;」がないことです。Kotlinでは行末の「;」が省略可能なのです。その代わり改行するだけで行末とみなされるます。
 説明は以上です。
 個人的にはこの仕様が一番ありがたいと思っています。
 「;」のつけ忘れでコンパイルエラーが送られることもなく、純粋にコードの記述が楽になります。

### 出力

最後はHelloWorldの出力です。

```
Kotlin println(a)
```

```
Java System.out.println(a);
```

ここの差はわかりやすいですね。「System.out.」がありません。
 これは単純でKotlinでは、printlnがメソッドではなくクラスに属さない関数として実装されているためです。前述した「クラスを用意することなく関数を実装できる」というKotlinの特徴が現れています。

## おわりに

以上で今回のKotlinに関する説明は以上です。この記事でKotlinへ興味を持ってもらえたなら幸いです。
 KotlinはAndroidアプリやサーバーサイドでつかわれているためそのあたりが気になっている人は是非一度触ってみることをお勧めします。

Kotlinにはこの記事だけでは紹介しきれなかったすごくて便利な機能がまだまだあります。Javaが書ける人ならKotlinの学習もしやすいと思うので、ぜひ手を伸ばしてみてください。
 AndroidデベロッパーのサイトではKotlinに関する使い方や特徴を細かく解説してくれています。
[https://developer.android.com/kotlin?hl=ja](https://developer.android.com/kotlin?hl=ja)

それではこの記事を読んでいただきありがとうございました。