Android Kotlin codelab courseで、今から最新のAndroidアプリ開発を始めよう

# Android Kotlin codelab coursesとは

先日新しくAndroidを試しながらWeb上で学べるコースがGoogleから提供されました。
この記事ではそれぞれのコースの内容を軽く紹介することで、コースを始めるのを楽にしようとしています。
何かツッコミなどあれば編集リクエストかコメントかTwitterでいただければ修正いたします :pray: 


[チュートリアルだと気づけないAndroidを始める上で必要になる知識](https://qiita.com/takahirom/items/af6b83edd0dc3294046f)も作成しました。開発したりする上で最低限必要な知識をまとめています。

---

Androidアプリ開発はかなり目まぐるしく技術が変わるため、数年前のネット上の記事などを見ながら開発したりすると非推奨になっているAPIを利用してしまったり、ビルドができなかったりします。
今一番新しい知識がまとめられたコースができていて、これを利用していくのが良さそうです。

https://android-developers.googleblog.com/2019/09/new-android-kotlin-codelab-courses-are.html

---

# 2つのコース

このコースではKotlin Bootcamp CourseとAndroid Kotlin Fundamentals Courseがあります。

---

* Kotlin Bootcamp Course  
https://codelabs.developers.google.com/kotlin-bootcamp/

Kotlinの基礎を知ることができるコースです。AndroidアプリはJavaでも開発できますが、[GoogleはAndroid開発においてKotlin Firstを表明](https://www.publickey1.jp/blog/19/googleandroidkotlingoogle_io_2019.html)しており、Kotlinから利用しやすいAndroidのAPIを作成しているので、今からAndroidを学ぶのであればKotlinから学んでいくのが良いでしょう。

---

* Android Kotlin Fundamentals Course  
https://codelabs.developers.google.com/android-kotlin-fundamentals/

KotlinでAndroidアプリを作成する上での基礎を知ることができます。

---

# それぞれのコースの内容の紹介

内容が英語で書かれているため、最初はとっかかりにくいのではないでしょうか。
**日本語で、それぞれのコースの内容を少しだけ概要を説明しておきますので、サクッとどんな内容かを見てから取り組むとちょっと楽になるかもです。**

---

## Kotlin Bootcamp Course  
Kotlin Bootcamp Courseのそれぞれの項目について説明してきます。
https://codelabs.developers.google.com/kotlin-bootcamp/

---

### Welcome to the course
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-welcome/#0
コースを受講するためにはオブジェクト指向言語によるプログラミング経験が必要であったり、IDEによる開発経験が必要であることや、コースの内容が書かれています。

---

### Get started (3タスク) 9%
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-introduction/#0

内容は以下の通りで、Kotlinに関して学んでいけます。

* KotlinのJavaと比べた利点
   * 堅牢であること(null例外が起こりにくい仕組みになっているなど)
   * 完結で読みやすいコードであること(Javaで20行ぐらいのコードが1行で書けたりする)
   * Javaと互換性があること(Javaのライブラリを使えたり、JavaがあるプロジェクトにKotlinを入れられたりする)
* JDKのインストール方法(Kotlinのプログラムを動かすのに必要なJavaのインストール)
* IntelliJ IDEAのインストール(Kotlinが書きやすいIDEのインストール)
* "Kotlin REPL"を使ってHello Worldを表示してみる
    * REPL = Read-Eval-Print Loopで、Kotlinで書いたコードを読んで、実行して、結果を出力してくれる。シェルみたいなものです。
* Kotlinの基礎的な文法

KotlinのHello World

```kotlin
fun printHello() {
    println ("Hello World")
}

printHello()
```

---

### Kotlin basics (4タスク) 21%
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-basics/#0


* Koltinの基本的な文法を学んでいきます。 書かれているプログラムをKotlin REPL※で実際に打ち込みながら試していきましょう。
    * val, var: 変数の宣言、再代入可能かどうか
    * Int, Doubleとその変換
    * Stringと文字列テンプレート
    * if else
    * when: だいたいswitchのKotlinバージョン
    * nullabilityとその扱い方
        * KotlinはNullable型とNunNull型が分かれているので、もし今まで分かれていないプログラミング言語でやっていたならやっておいたほうが良いでしょう。
    * list, array
    * forループ

※ REPL = Read-Eval-Print Loopで、Kotlinで書いたコードを読んで、実行して、結果を出力してくれる。シェルみたいなものです。

---

### Functions (6タスク) 40%
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-functions/#0

* KotlinのFileを作ってmain functionを定義し、Hello Worldを出力してみる
* main functionで引数を渡す方法
* Kotlinでは if文などが値を持っているので以下のように書ける

```kotlin
val isHot = if (temperature > 50) true else false
```
* functionの作り方
* functionを使ったコードの例
* デフォルト引数
* single-expression function

```kotlin
fun isTooHot(temperature: Int) {
    return temperature > 30
}
// ↓のように書ける
fun isTooHot(temperature: Int) = temperature > 30
```
* listの内容をfilter()でフィルタする
* `Sequence`と通常のListを比べる。(ここ少しむずかしいと思いますが、分からなくてもAndroidの普段の開発では問題ない(asSequenceが必要になるほどの計算量があるものをなかなか扱わない)ので、飛ばしちゃって良いと思います)
* ラムダ

---

### Object-oriented programming (7タスク) 62%
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-classes/#0

* Aquariumクラスを作りながらKotlinのクラスのさまざまな機能に触れていきます
* data class: 便利な機能がついたクラス
* singleton: objectというキーワードで作るとシングルトンがかんたんに作れる(interface delegationの話が(class A: B by C)ありますが、この機能は便利ですが、めちゃくちゃ使う機能ではないので、よく分からなくても続けていきましょう)
* enum class
* sealed classes: enumのように列挙可能でインスタンスを作れるクラス エラーハンドリングなど様々な場面でかなり使えるので、見ておいたほうが良さそうです。

---

### Extensions (4タスク) 75%
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-extensions/#0

* Pairを返すメソッドがある話  
最初に書いてあるのですが、一見わかりにくいので解説しておきます

以下のようにListに対して、`partition()`メソッドを使うことでPairというクラスのインスタンスを返すことができ、それにより2つにListを分けることができるという話です。

```kotlin
>>> data class Fish(val name : String)
>>> val fishList = listOf(Fish("medaka"), Fish("koi"), Fish("maguro"))
>>> fun isFreshWater(fish: Fish) = listOf("medaka", "koi").contains(fish.name)
>>> val twoLists = fishList.partition { isFreshWater(it) } // ← **ここでPairを作成**
>>> println(twoLists)
([Fish(name=medaka), Fish(name=koi)], [Fish(name=maguro)])
>>> println("freshwater: ${twoLists.first}")
freshwater: [Fish(name=medaka), Fish(name=koi)]
>>> println("saltwater: ${twoLists.second}")
saltwater: [Fish(name=maguro)]
```

* Pairの作り方: "A" to "B"で "A"と"B"のPairクラスのインスタンスが作れる
* Pairを分解できる話。 val (a, b) = pairでPairを分解できる。
* Listの作り方、使い方。
* const vs valの話: constはコンパイル時に決定される。など
* Extension function, propertyの書き方

---

### Generics (3タスク) 84%
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-generics/#0

List<String>などのリストの型に使ったりなどするあれです。

* 基本的なジェネリクスの使い方
* Nullable、NonNullなGenericsの型の宣言の仕方
* Genericsのin out
* 関数にジェネリクスを付ける場合の話
* reified typeを使う話。(これを使うとコンパイル時にGenericsの型を解決するので、クラス名にアクセスできたり、キャストや判定ができたりする)


---

### Functional manipulation (5タスク) 100%
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-sams/#0

もうKotlinの少し踏み込んだ話が入っています。

* アノテーションの作り方、使い方
* ラベルによるbreak(2重ループからの脱出など)
* 簡単なラムダの使い方
* with()と自分でそのwith()を作ってみる
* run letなど
* inline functionによってメモリとCPUのオーバーヘッドを減らす話
* SAM変換 一つのabstractメソッドのみを持つクラスの実装をラムダとして書くことができる話


---

## Android Kotlin Fundamentals Course  
Android Kotlin Fundamentals Courseのそれぞれの項目について説明していきます。
https://codelabs.developers.google.com/android-kotlin-fundamentals/


### Android Kotlin Fundamentals: Welcome to the course
https://codelabs.developers.google.com/codelabs/kotlin-android-training-welcome/index.html?index=..%2F..android-kotlin-fundamentals
それぞれのコースについて説明があります。

### レッスン 1.0〜1.4 「Build your first app」
 * Android StudioをKotlinと共に使う方法を説明しています。
"Hello World"から開始し、画像ファイルを使って表示し、クリックハンドラを追加します。
 * Androidのプロジェクトがどのように構成されているのかを説明し、KotlinのAndroidアプリでviewの使い方、変更の仕方を説明し、どのように後方互換性を保つかを説明します。またAndroidのAPI Levelについてと、Android Jetpackライブラリについて学びます。

#### 01.0: Install Android Studio
https://codelabs.developers.google.com/codelabs/kotlin-android-training-install-studio/index.html?index=..%2F..android-kotlin-fundamentals
#### 01.1: Get started
https://codelabs.developers.google.com/codelabs/kotlin-android-training-get-started/index.html?index=..%2F..android-kotlin-fundamentals
#### 01.2: Basic app anatomy
https://codelabs.developers.google.com/codelabs/kotlin-android-training-app-anatomy/index.html?index=..%2F..android-kotlin-fundamentals
#### 01.3: Image resources and compatibility
https://codelabs.developers.google.com/codelabs/kotlin-android-training-images-compat/index.html?index=..%2F..android-kotlin-fundamentals
#### 01.4: Learn to help yourself
https://codelabs.developers.google.com/codelabs/kotlin-android-training-available-resources/index.html?index=..%2F..android-kotlin-fundamentals

### レッスン 2.1〜2.4 「Layouts」
  * Android Studio Layout Editorの使い方、LinearLayout※1 とConstraintLayout※2 の使い方を説明しています。
  * ユーザーからのインプットを受け取って、表示するアプリを作ります。このレッスンではDataBindingも使って非効率な`findViewById()`を除去する方法も学びます。

※1 LinearLayout: Viewをただ並べるレイアウトのこと
※2 ConstraintLayout: 現在一番一般的に使われるレイアウトで制約でレイアウトを記述する

#### 02.1: Linear layout using the Layout Editor
https://codelabs.developers.google.com/codelabs/kotlin-android-training-linear-layout/index.html?index=..%2F..android-kotlin-fundamentals
#### 02.2: Add user interactivity
https://codelabs.developers.google.com/codelabs/kotlin-android-training-interactivity/index.html?index=..%2F..android-kotlin-fundamentals
#### 02.3: Constraint layout using the Layout Editor
https://codelabs.developers.google.com/codelabs/kotlin-android-training-constraint-layout/index.html?index=..%2F..android-kotlin-fundamentals
#### 02.4: Data-binding basics
https://codelabs.developers.google.com/codelabs/kotlin-android-training-data-binding-basics/index.html?index=..%2F..android-kotlin-fundamentals

### レッスン 3.1〜3.3 「Navigation」
  * アプリの中のナビゲーションの作り方を説明しています。
  * まずFragment※1 を作り、アプリに追加します。そして、Android Studio navigation graphを使ってアプリにナビゲーションを追加します。ナビゲーションドロワー※2 を作ってオプションメニューをアプリに追加します。そしてバックスタック※3 と共にそのナビゲーションドロワーを使えるようにします。アプリから別のActivity※4 への起動の仕方を学びます。

※1 Fragment: ユーザーインターフェースの中の部品を表すもの。通常Activityに入る
※2 ナビゲーションドロワー: 横からスライドして出てくるメニュー
※3 バックスタック: 戻るボタンなどで戻れる仕組み
※4 Activity: 画面を提供するコンポーネントで、この中にFragmentが入る

#### 03.1: Create a fragment
https://codelabs.developers.google.com/codelabs/kotlin-android-training-create-and-add-fragment/index.html?index=..%2F..android-kotlin-fundamentals
#### 03.2: Define navigation paths
https://codelabs.developers.google.com/codelabs/kotlin-android-training-add-navigation/index.html?index=..%2F..android-kotlin-fundamentals
#### 03.3: Start an external activity
https://codelabs.developers.google.com/codelabs/kotlin-android-training-start-external-activity/index.html?index=..%2F..android-kotlin-fundamentals

### レッスン 4.1〜4.2 「Activity and fragment lifecycles」
  * ActivityとFragmentのライフサイクルとその複雑な場面でのハンドリング方法を説明します。
  * ライフサイクルに関するバグを含むアプリから開発を始め、ロギングを追加し、ライフサイクルのイベントに対する理解を深め、バグを修正し、アプリの価値を高めます。そしてライフサイクルのイベントを簡単に管理できるAndroid Jetpackのlifecycleライブラリについて学びます。

#### 04.1: Lifecycles and logging
https://codelabs.developers.google.com/codelabs/kotlin-android-training-lifecycles-logging/index.html?index=..%2F..android-kotlin-fundamentals
#### 04.2: Complex lifecycle situations
https://codelabs.developers.google.com/codelabs/kotlin-android-training-complex-lifecycle/index.html?index=..%2F..android-kotlin-fundamentals

### レッスン 5.1〜5.4 「Architecture components」
  * ViewModelとLiveData※の使い方を説明しています。
  * 画面回転を通して生き残るViewModelをどのように使うかを知ります。
  * UIのデータをLiveDataで包み、LiveDataの値の変更を知るObserverを追加します。
  * DataBindingとともにLiveDataとViewModelを使って、Fragment内で経由させずに、レイアウトと直接ViewModelを通信させます。このテクニックはコードを減らして、単純化させることができます。

※ ViewModelとLiveDataはライフサイクルを考慮して動いてくれるコンポーネントです。どのように動いてくれるのかを学べます。


#### 05.1: ViewModel and ViewModelFactory
この説明を読んでから始めるとやりやすそうです。
https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja

概要の概要

* AndroidではActivityやFragmentはconfgration change(画面回転などの時に起こる)のたびにインスタンスが作り直される。
* インスタンスが作り直されるので、そこで保持していたデータ失われる
* SavedInstanceStateを使っても同じことができるが、リストのデータなどデータ量が多い場合は適していない。
* ActivityやFragmentで直接非同期でAPI呼び出しした時には破棄された時にクリーンアップしたりしてメモリリークが起こらないようにする必要がある。また再度呼び出ししたりなどリソースが無駄になる。
* ActivityやFragmentでデータの通信、DBへのアクセスなどを書くと肥大化し、テストも困難になる。

* ViewModelはFragmentやActivityなどより生存期間が長くなるように設計されている
* ViewModelではViewやライフサイクルが見えないので、ViewModelに対してテストを簡単に作成することもできる

https://codelabs.developers.google.com/codelabs/kotlin-android-training-view-model/index.html?index=..%2F..android-kotlin-fundamentals
#### 05.2: LiveData and LiveData observers
この説明を読んでから始めるとやりやすそうです。
https://developer.android.com/topic/libraries/architecture/livedata?hl=ja



https://codelabs.developers.google.com/codelabs/kotlin-android-training-live-data/index.html?index=..%2F..android-kotlin-fundamentals
#### 05.3: Data binding with ViewModel and LiveData
https://codelabs.developers.google.com/codelabs/kotlin-android-training-live-data-data-binding/index.html?index=..%2F..android-kotlin-fundamentals
#### 05.4: LiveData transformations
https://codelabs.developers.google.com/codelabs/kotlin-android-training-live-data-transformations/index.html?index=..%2F..android-kotlin-fundamentals

概要の概要

* LiveDataはライフサイクルに応じた観測ができるデータを保持するクラスです。
* liveData.observe(activity, {data -> ... })のようにActivityなどのライフサイクルオーナーを渡して、観測します。
* Activityなどのライフサイクルがアクティブなときだけ通知されます。
* Activityなどのライフサイクルがdestored、つまりonDestoryが呼ばれたになったときにオブザーバーが削除されます

なぜLiveDataを使うか？
公式に簡潔にかいてあります

 * https://developer.android.com/topic/libraries/architecture/livedata?hl=ja


### レッスン 6.1〜6.3 「Room database and coroutines」
  * Room※1 ライブラリの使い方を説明しています。
  * Kotlin coroutinesを使ってmain threadではなくDBを操作する方法を学べます。またViewModelやLiveDataについても知ることができます。

※1 SQLiteを扱いやすくしてくれるライブラリ
#### 06.1: Create a Room database
https://codelabs.developers.google.com/codelabs/kotlin-android-training-room-database/index.html?index=..%2F..android-kotlin-fundamentals
#### 06.2: Coroutines and Room
https://codelabs.developers.google.com/codelabs/kotlin-android-training-coroutines-and-room/index.html?index=..%2F..android-kotlin-fundamentals
#### 06.3: Use LiveData to control button states
https://codelabs.developers.google.com/codelabs/kotlin-android-training-quality-and-states/index.html?index=..%2F..android-kotlin-fundamentals

### レッスン 7.1〜7.5 「RecyclerView」
  * リストやグリットでアイテムを効率的に表示できるRecyclerViewの使い方を説明しています。
  * RecyclerViewでメンテナンスしやすく拡張しやすいリストの作り方を説明しています。
  * RecyclerView内のアイテムをクリックできるようにします。
  * ヘッダーを追加したいときのような1つ以上のレイアウトを追加したいときの方法を説明しています。

#### 07.1: RecyclerView fundamentals
https://codelabs.developers.google.com/codelabs/kotlin-android-training-recyclerview-fundamentals/index.html?index=..%2F..android-kotlin-fundamentals
#### 07.2: DiffUtil and data binding with RecyclerView
https://codelabs.developers.google.com/codelabs/kotlin-android-training-diffutil-databinding/index.html?index=..%2F..android-kotlin-fundamentals
#### 07.3: GridLayout with RecyclerView
https://codelabs.developers.google.com/codelabs/kotlin-android-training-grid-layout/index.html?index=..%2F..android-kotlin-fundamentals
#### 07.4: Interacting with RecyclerView items
https://codelabs.developers.google.com/codelabs/kotlin-android-training-interacting-with-items/index.html?index=..%2F..android-kotlin-fundamentals
#### 07.5: Headers in RecyclerView
https://codelabs.developers.google.com/codelabs/kotlin-android-training-headers/index.html?index=..%2F..android-kotlin-fundamentals

### レッスン 8.1〜8.3 「Connecting to the internet」
  * Retrofitというライブラリを使ってデータを取得、表示を説明しています。
  * どのようにエラーハンドリングするかやGlideというライブラリを使ってインターネットから画像を表示する方法、そして取得した画像をRecyclerViewで表示する方法を学びます。

#### 08.1: Getting data from the internet
https://codelabs.developers.google.com/codelabs/kotlin-android-training-internet-data/index.html?index=..%2F..android-kotlin-fundamentals
#### 08.2: Loading and displaying images from the internet
https://codelabs.developers.google.com/codelabs/kotlin-android-training-internet-images/index.html?index=..%2F..android-kotlin-fundamentals
#### 08.3 Filtering and detail views with internet data
https://codelabs.developers.google.com/codelabs/kotlin-android-training-internet-filtering/index.html?index=..%2F..android-kotlin-fundamentals

### レッスン 9.1〜9.2 「Repository」
  * データ層を抽象化して、クリーンなAPIを提供するテクニックを説明しています。
  * また最適化されたバックグラウンドタスク実行するためにWorkManagerの使い方を学べます。

#### 09.1: Repository
https://codelabs.developers.google.com/codelabs/kotlin-android-training-repository/index.html?index=..%2F..android-kotlin-fundamentals
#### 09.2: WorkManager
https://codelabs.developers.google.com/codelabs/kotlin-android-training-work-manager/index.html?index=..%2F..android-kotlin-fundamentals

### レッスン 10.1〜10.3 「Designing for everyone」
  * アプリのデザインの基礎を説明しています。
  * Google Developer Group (GDG)のミートアップを探すアプリを作りながら説明しています。


#### 10.1: Styles and themes
https://codelabs.developers.google.com/codelabs/kotlin-android-training-styles-and-themes/index.html?index=..%2F..android-kotlin-fundamentals
#### 10.2: Material Design, dimens, and colors
https://codelabs.developers.google.com/codelabs/kotlin-android-training-material-design-dimens-colors/index.html?index=..%2F..android-kotlin-fundamentals
#### 10.3: Design for everyone
https://codelabs.developers.google.com/codelabs/kotlin-android-training-design-for-everyone/index.html?index=..%2F..android-kotlin-fundamentals

# まとめ
少し量が多いと思いますが、Androidではこのように網羅的にまとまっている、かつ最新の情報は少ないので、
今から始めるのにおすすめできます。