第3回まで無料

Kotlin & Android 入門コース

環境構築から、変数と null 安全・関数とクラス・Jetpack Compose・Navigation と ViewModel・Room と Retrofit・テストと署名まで。全50レッスンで「Compose で作ったメモアプリを、Google Play に出せる形(署名した AAB)まで仕上げる」ところまで進みます。コードと実行結果はすべて Kotlin 2.4.20・JDK 21 で実際に動かしたものです。

カリキュラム

全50レッスンを7つの章に分けています。第1章から順に進めるのがおすすめですが、 気になるところだけ拾い読みしてもかまいません。 ※ Kotlin と Android はブラウザ内で実行できないため、Android Studio か、手元の JDK 21 と Gradle(./gradlew)で試してください。

Chapter 1 — Kotlin を始める(第1〜7回)

Kotlin を書いて動かす環境を作り、変数と型・文字列と数値・null 安全・条件分岐とループを押さえます。Android から離れて、言語だけに集中する章です。

1

Kotlin とは何か(Java と書き比べる)

同じクラスを Java と Kotlin で書き比べ、data class の短さ・null 安全・Java との相互運用という 3 つの特長をテストで確認。

Free
2

開発環境を作る(Android Studio・JDK 21・Gradle)

Android Studio・JDK 21・Gradle の役割を整理し、サンプルを開いて最初のプログラムとテストを Gradle ラッパーで動かすところまで。

Free
3

変数と型(val と var・型推論)

val と var の使い分けと、Int・Long・Double・Boolean・Char・String。整数の割り算の切り捨て、Int のあふれ、小数の誤差、Int と Long の明示的な変換。

Free
4

文字列と数値(テンプレートと toIntOrNull)

文字列テンプレートと生の文字列、3 桁区切りの書式、toInt と toIntOrNull の違い、split が残す空の要素、絵文字の length が 2 になる理由。

🔒 ベーシック
5

null 安全(?・?.・?:・!!)

String と String? は別の型。?.・?:・スマートキャスト・?.let で null を安全に扱い、!! は最後の手段。Java から来るプラットフォーム型がどこで落ちるか。

🔒 ベーシック
6

if と when(式として値を返す)

if と when は値を返す式。else が必須になる理由、範囲(in)と型(is)で分ける when、ガード条件、対象を書かない when と枝の順番。

🔒 ベーシック
7

ループと範囲(for・while・ラベル付き break)

for と範囲の 4 つの書き方(終わりを含む・含まない・step・downTo)、withIndex で位置と値を一緒に取る方法、ラベル付き break で二重ループを抜ける書き方、ラムダの中からの break、while と repeat。

🔒 ベーシック

Chapter 2 — Kotlin の関数とクラス(第8〜14回)

関数とラムダ、クラス・データクラス・sealed・インターフェース、スコープ関数とコレクション操作を学びます。Android のコードを読むのに必要な書き方が、この章でそろいます。

8

関数(既定値・名前付き引数・vararg)

単一式の関数、既定値つき引数と名前付き引数でオーバーロードを減らす書き方、vararg、ローカル関数、Unit と Nothing の違い。

🔒 ベーシック
9

ラムダと高階関数(トレーリングラムダと it)

{ } で書く名前の無い関数(ラムダ)と関数の型、関数を受け取る高階関数、トレーリングラムダと it、関数の参照 ::、外の変数を覚えるクロージャ。

🔒 ベーシック
10

クラスとプロパティ(private set とバッキングフィールド)

プライマリコンストラクタと init・require、private set で外から書き換えさせないプロパティ、カスタムゲッター、Kotlin 2.4 の明示的なバッキングフィールド、by lazy。

🔒 ベーシック
11

データクラス・enum・sealed(種類を型で表す)

決まった値から選ぶ enum class、値の入れ物の data class(copy と分解)、種類ごとに持つ情報が違う sealed interface。when の枝が足りないとコンパイルエラーになる利点。

🔒 ベーシック
12

インターフェースと object(継承は open だけ)

interface で「できること」を約束し、既定の実装も持たせる。open を付けたクラスだけ継承できる Kotlin の考え方、object(シングルトン)と companion object。

🔒 ベーシック
13

スコープ関数と拡張関数(let・apply・also)

既にあるクラスに関数を足したように書ける拡張関数。5 つのスコープ関数の違いは「中で this か it か」と「何を返すか」の 2 点だけ。迷ったら ?.let・apply・also。

🔒 ベーシック
14

コレクション操作(filter・groupBy・Sequence)

読み取り専用の List・Set・Map と、filter・map・sumOf・groupBy・sortedByDescending・partition・associateBy で for を書かずに処理する方法。Sequence と Kotlin 2.4 の isSorted。

🔒 ベーシック

Chapter 3 — Android アプリの土台(第15〜21回)

最初の Android アプリを動かし、プロジェクトの構成・Activity のライフサイクル・リソース・マニフェストを押さえます。最後は Logcat とデバッガで、動いているアプリの中をのぞきます。

15

最初の Android アプリ(MainActivity とマニフェスト)

Empty Activity のテンプレートで最初のアプリを作り、MainActivity とマニフェストを 1 行ずつ読む。エミュレーターとプレビューで見て、Robolectric によるエミュレーターなしのテスト。

🔒 ベーシック
16

プロジェクトの構成(build.gradle.kts と APK の中身)

アプリの build.gradle.kts を省略せずに読み、compileSdk・minSdk・targetSdk・applicationId の違いを整理。R と BuildConfig で設定をコードから読み、APK の中身を aapt2 で確認。

🔒 ベーシック
17

Activity とライフサイクル(呼ばれる順番を確かめる)

起動・ホームに戻る・閉じる・回転のたびに呼ばれる 6 つの関数と 3 つの状態。ActivityScenario の moveToState と recreate で、呼ばれる順番をテストで確認。

🔒 ベーシック
18

構成の変更と状態の保存(rememberSaveable)

回転・言語・テーマの切り替えで Activity は作り直される。remember と rememberSaveable のカウンターを並べ、どちらが残るかを StateRestorationTester と recreate で確認。

🔒 ベーシック
19

リソースと多言語対応(values-ja と values-night)

文字列と色を res/ に置き、values-ja・values-night の修飾子で端末の言語やダークテーマに合わせて切り替える。%1$s の差し込みと plurals、Robolectric の qualifiers でのテスト。

🔒 ベーシック
20

マニフェストとインテント(明示的と暗黙的)

Activity をマニフェストに書き、exported でほかのアプリから開けるかを決める。明示的インテントで自分の画面に値を渡し、暗黙的インテントで共有と URL を開く。nextStartedActivity でのテスト。

🔒 ベーシック
21

Logcat とデバッグ(ログのレベルとブレークポイント)

Log.d・i・w・e をレベルで使い分け、TAG で絞り込む。例外は Log.e の 3 つ目に渡す。ShadowLog でログをテストし、ログで分からないときのブレークポイント。

🔒 ベーシック

Chapter 4 — Jetpack Compose で画面を作る(第22〜30回)

Composable 関数・レイアウト・Modifier・状態・リスト・テーマで、Compose の画面づくりを一通り学びます。最後はここまでの部品を組み合わせて、メモ画面を作ります。

22

Composable 関数(画面の部品を関数で書く)

@Composable を付けた、大文字で始まり戻り値の無い関数が画面の部品になる。if・for で出す・並べるを決め、@Preview で見た目を確かめ、createComposeRule で部品だけをテスト。

🔒 ベーシック
23

Column と Row と Box(Arrangement と Alignment)

縦に並べる Column、横に並べる Row、重ねる Box。並べる向きの Arrangement と直角の向きの Alignment の違いを整理し、dp の単位で部品の位置を測るテスト。

🔒 ベーシック
24

Modifier(書く順番で結果が変わる)

Modifier は書いた順に外側から内側へかかる。size と padding の順番で全体が 100dp と 120dp に変わり、clickable と padding の順番で余白が押せるかが変わることを、測って確認。

🔒 ベーシック
25

状態と recomposition(描き直されるのはどこか)

ふつうの変数では画面が変わらない理由と、mutableIntStateOf・remember の役割。描き直しの回数を数え、状態を読んでいるところだけが描き直されることを確認。

🔒 ベーシック
26

TextField と Button(入力を状態で持つ)

入力欄の中身を状態で持ち、value で映して onValueChange で書き換える。isError と supportingText のエラー表示、キーボードの種類、状態から決めるボタンの enabled。

🔒 ベーシック
27

LazyColumn(見えている分だけ作る一覧)

100 件の商品を LazyColumn で並べ、360×640dp の画面で作られたのは 8 行だけであることを確認。行とデータを結ぶ key と、追加・削除を画面に知らせる mutableStateListOf。

🔒 ベーシック
28

Scaffold とマテリアル部品(TopAppBar・FAB・Snackbar)

上のバー・右下のボタン・下からのお知らせを Scaffold に並べ、本文には innerPadding を必ず使う。Snackbar はコルーチンの中で出し、waitUntil で出るまで待つテスト。

🔒 ベーシック
29

テーマとダークモード(役割の名前で色を読む)

色を役割の名前を持つカラースキームにまとめ、ライトとダークの 2 つを用意する。AppTheme で端末のダークテーマとダイナミックカラー(Android 12 から)に合わせ、qualifiers と sdk でテスト。

🔒 ベーシック
30

【実践】メモ画面(第4章の部品を組み合わせる)

入力欄・状態のリスト・LazyColumn・Scaffold を組み合わせ、追加・削除・0 件表示のあるメモ画面を作る。1 行のカードを状態を持たない部品に分け、並び順までテストで確認。

🔒 ベーシック

Chapter 5 — 画面遷移とアーキテクチャ(第31〜38回)

Navigation で画面をつなぎ、ViewModel・状態ホイスティング・単方向データフローで状態の置き場所を決めます。最後はメモ画面を、画面・ViewModel・Repository の 3 層に分けます。

31

Navigation(型安全なルートで画面を切り替える)

1 つの Activity の中で Navigation が画面を切り替える。行き先を @Serializable のオブジェクトで型として書き、NavHost の対応表と NavController の navigate・popBackStack、TestNavHostController でのテスト。

🔒 ベーシック
32

画面遷移と引数(toRoute と popUpTo)

引数のある行き先を data class で書き、navigate(MemoDetail(id = 3)) で渡して toRoute で受け取る。渡すのは id のような小さな値だけ。popUpTo でのバックスタックの整理。

🔒 ベーシック
33

ViewModel(回転しても残る画面の状態)

画面の状態を ViewModel に移し、StateFlow で外には読み取り専用に見せる。viewModel() と collectAsStateWithLifecycle() で Compose から読み、Activity を作り直しても値が残ることを remember と比べて確認。

🔒 ベーシック
34

状態ホイスティング(値は下へ、出来事は上へ)

部品の中に閉じ込めた状態を外に持ち上げ、「いまの値」と「変わったら呼ぶ関数」を受け取る形にする。状態は使う部品のいちばん近い共通の親に置き、状態を持たない部品のテスト。

🔒 ベーシック
35

単方向データフロー(UiState と出来事)

画面に必要な値を UiState にまとめて ViewModel が持ち、画面は描いて出来事を関数で知らせるだけにする。copy で更新し、TodoRoute と TodoScreen に分けて、ViewModel と画面を別々にテスト。

🔒 ベーシック
36

SavedStateHandle(プロセスが終了しても残す)

ViewModel は回転では残るがプロセスの終了では消える。SavedStateHandle に小さな値を保存し、getStateFlow で画面に流す。プロセスが作り直されたときと同じ状態をテストで作って確認。

🔒 ベーシック
37

依存性の注入(手作りの AppContainer)

ViewModel が使う部品を中で作らず、コンストラクタで受け取る。約束を interface にし、Application に置いた AppContainer と viewModelFactory で渡す。テストでの偽物(Fake)への取り替え。

🔒 ベーシック
38

【実践】メモアプリの構成(画面・ViewModel・Repository)

第30回のメモ画面を一覧と編集の 2 画面にし、画面・ViewModel・Repository の 3 層に分ける。行き先の id を ViewModel が SavedStateHandle から受け取り、アプリ全体を通しでテスト。

🔒 ベーシック

Chapter 6 — データと通信(第39〜45回)

コルーチンと Flow で非同期の処理を書き、Room でデータを保存し、Retrofit で API とやり取りします。通信のエラー処理と、実行時の権限の要求まで進みます。

39

コルーチン(suspend・async・構造化された並行性)

スレッドを止めずに待てる suspend 関数と delay、async と await で同時に待つ方法、失敗すると仲間も取り消す構造化された並行性、withTimeoutOrNull と withContext、runTest の仮想の時間。

🔒 ベーシック
40

Flow(値がいくつも流れてくる)

flow { emit() } で作り collect で集める冷たい Flow、map・filter での変換、いつも今の値を持つ StateFlow、Turbine の awaitItem、打ち終わるまで待つ debounce。

🔒 ベーシック
41

Room でデータを保存(Entity・DAO・Database)

端末の SQLite を Room 3 で扱う。Entity(表の 1 行)・DAO(読み書きの関数)・Database(入れ物)を書き、KSP がコードを作る。メモリの中のデータベースでテストし、開き直しても残ることを確認。

🔒 ベーシック
42

Room と Flow(書けば画面が自動で変わる)

DAO から Flow を返し、表が書き換わるたびに新しい結果を流す。Repository で画面向けの形に変え、ViewModel で stateIn と viewModelScope を使う。流れてくる値の Turbine での確認。

🔒 ベーシック
43

Retrofit で通信(JSON と MockWebServer)

GitHub の公開 API からユーザーの情報を取ってくる。JSON の形を @Serializable の data class で、窓口を interface の suspend 関数で書き、MockWebServer の偽物のサーバーで問い合わせまでテスト。

🔒 ベーシック
44

通信のエラー処理(sealed の UiState で出し分ける)

画面の状態を sealed interface で「どれか 1 つ」にし、HttpException・InterruptedIOException・IOException・SerializationException を細かい順に捕まえて出し分ける。CancellationException は捕まえず、失敗を MockWebServer で再現。

🔒 ベーシック
45

権限の要求(通知の許可を聞く)

Android 13 から必要になった通知の許可を題材に、マニフェスト・checkSelfPermission・rememberLauncherForActivityResult で実行時の権限を求める。聞き方の作法と通知チャンネル、sdk を変えたテスト。

🔒 ベーシック

Chapter 7 — アプリを公開する(第46〜50回)

ViewModel と Compose の UI をテストし、ビルドバリアントと署名を設定して、Play Console に提出する準備をします。最後はメモアプリを 1 本に仕上げて、コースを締めくくります。

46

ViewModel のテスト(MainDispatcherRule と仮想の時計)

viewModelScope が動く Main をテストでは MainDispatcherRule で差し替え、runTest に同じ Dispatcher を渡して advanceTimeBy・runCurrent・advanceUntilIdle で仮想の時計を進める。偽物の Repository で呼ばれた回数まで確認。

🔒 ベーシック
47

Compose の UI テスト(探す・操作する・確かめる)

UI テストを finder・action・assertion の 3 つで整理。文字 → contentDescription → testTag の順に探し、画面の外の行はスクロールしてから確かめる。見つからないときの printToString とセマンティクスの木。

🔒 ベーシック
48

ビルドバリアントと署名(free と pro、R8、鍵)

buildType(debug・release)と productFlavor(free・pro)をかけ合わせた 4 つのビルドバリアント。release は R8 で 11.6MB から 0.76MB に。自分の鍵での署名と、鍵をリポジトリに入れない管理。

🔒 ベーシック
49

Play Console への提出(AAB とアップロード鍵)

applicationId・versionCode・versionName・targetSdk を確かめ、アップロード鍵で署名した AAB を bundleRelease で作る。Play アプリ署名の 2 本の鍵、出す前の確認のテスト、Play Console でする作業とテストのトラック。

🔒 ベーシック
50

【実践】総まとめ(メモアプリを 1 本に仕上げる)

7 章で学んだ部品を 1 つのメモアプリにまとめる。Room と Repository、suspend に合わせた ViewModel、Navigation と Compose の画面、データ・状態・画面の 3 段のテスト、そして次に学ぶこと。

🔒 ベーシック

全50レッスンを終えたら、次は対になる iOS 側の言語を学ぶ Swift 入門コース や、アプリがつなぐサーバーを Kotlin と同じ JVM で作る Spring Boot 入門コース へ。メンバーシップで全コースが解放されます。