Android開発ではじめるKotlin

# 導入 ~Kotlinを入れる~

Kotlinを使うにはやはりインストールが必要になります。
ですが、KotlinはAndroidStudioを手軽に使えるように出来ます

## 手順

AndroidStudio上から

```
Preference->Plugins->Install JetBrain Plugins
```

と進み、左上の検索ボックスに"kotlin"と打ち込むと関連する項目が出てきます
その中から **Kotlin** を選択し、右側の **Install Plguin** を選択することでインストール出来ます

最後にAndroidStudioを再起動することで使えるようになります

# Android ProjectにKotlinを組み込む

Kotlinをインストールしたし、使えるようになっ・・・・・ってない
Android ProjectはデフォルトではJavaでビルドなどを行う設定になっています
そのためKotlinも仲間に加えるように設定しなければならないのです

## 手順

設定と言っても難しいものではありません
以下の通りにポチッとすれば大丈夫です

```
Tools->Kotlin->Configure Kotlin in Project
```

# 既存のJavaファイルをKotlinファイルに変換する

Kotlinを利用できる環境が整ったところで、JavaのソースコードをKotlinのソースコードに変換してみましょう
こちらもポチッとすると自動で変換してくれます

### 手順


### Step.1
まずは、変換対象のJavaファイルを開いてください
以下はBlank Activityを開いた際のMainActivity.javaになります

```java

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

```

### Step2

Javaファイルを開いた状態で以下の操作を行います

```
Code->Convert Java File to Kotlin File
```

タブに表示されるファイル名の部分が*.javaから*.ktへ変わっていると思います
また、ソースコードも以下のようになりました
これであなたもKotlin使いです！
次は、Java/Kotlinで変わっている部分を少しずつ見ていきます

```kotlin

import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.View
import android.view.Menu
import android.view.MenuItem

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar = findViewById(R.id.toolbar) as Toolbar
        setSupportActionBar(toolbar)

        val fab = findViewById(R.id.fab) as FloatingActionButton
        fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show() }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        val id = item.itemId

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true
        }

        return super.onOptionsItemSelected(item)
    }
}
```

# JavaとKotlinの違うところ

Kotlinにしたことでどう変わったのか実際に見ていきます

## クラス周り

まずはクラス周りで変わった部分ですが、先にどう変わっているのか抜粋した部分から

```java
public class MainActivity extends AppCompatActivity{ ... }
```

```kotlin
class MainActivity : AppCompatActivity(){ ... }
```


### アクセス修飾子

Kotlinでは基本的にpublicとして扱われるため、変換したファイルでは無くなっています

### 継承

Javaではextendsキーワードを利用していましたが、Kotlinではコロン(:)を利用するようになっています

### コンストラクタ

AppCompatActivity()という風に継承したクラスのコンストラクタを、継承したときに呼び出せるようになっています
もちろん引数有りのコンストラクタも書くことが出来ます

## 関数周り

次は関数に関してです

```Java
@Override
public boolean onOptionsItemSelected(MenuItem item){ ... }
```

```kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { ... }
```

### オーバーライド

アノテーションとして今までは記述をしていましたが、Kotlinでは関数宣言の先頭に書くようになりました

### 関数定義

Kotlinでは関数を定義する際にfunキーワードを利用するようになっています

### 引数と戻り値

引数も戻り値もそれぞれ名前の前で宣言する形から、コロン(:)を利用して後ろで宣言する形になりました

## その他

```java
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show();
  }
});

```

```kotlin
val fab = findViewById(R.id.fab) as FloatingActionButton
fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show() }
```

### valキーワード

これは変数の宣言をする際に使います
また、再代入が出来ない変数であることを示します
以下のコードは **2をaという変数に再代入するため** エラーになります

```kotlin
val a = 1
a = 2
```

### キャスト演算 as句

Javaではキャストを行うのに(型名)という形で利用していましたが、これでは括弧が増えて見づらくなってしまいます
それを解決するのがas句になります

### 型推論

皆さん変数を宣言する際にわざわざとってもとっても長いクラス名を何度もタイプするのは面倒ですよね？
例えばFloatingActionButtonとか・・・・

そういうのを楽にする機能がこの型推論になります

```kotlin
val fab = findViewById( R.id.fab ) as FloatingActionButton
```

代入演算子(=)の右側がFloatingActionButtonクラスであることは明白ですよね
そんなときには変数の宣言など明示的に型を書かなくても良くなります

### 無名関数（ラムダ関数）

Javaではボタンなどのリスナー登録に無名インターフェースを生成していたと思いますが、 **さらに簡単に** 扱えるようになりました

```kotlin
fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show() }
```

コードを見るとかなりすっきりしていますね
{}ブロックが関数の中身になっています

"view"は実引数の部分であり、続いてアロー句を書いてそのあとに関数の中身を書くようになっています
無名インターフェースを書かなくて良くなった分コーディングに集中できます

また無名関数が受け取る引数が一つであれば、引数名と->を省略してitという名前で受け取って利用することができます

```kotlin
fab.setOnClickListener {
  Snackbar.make( it, "Replace with your own action", Snackbar.LENGTH_LONG ).setAction( "Action", null).show()
}
```