最終更新:

Kotlinの始め方 — 買い物リストでnull安全とデータクラスを試す


買い物データを、条件で選んで名前へ

Item(名前・価格)りんご120円バナナ180円牛乳250円filter:価格が180以上map:名前を取り出す[バナナ, 牛乳]
商品を表すデータクラスと、filter・mapの役割を同じ買い物例で確認します。nullの扱いは本文の名前表示で試せます。
🎚 難易度 ★☆☆ 初心者向け
⏱ 学習時間の目安 読むだけで概要をつかみ、手元で1つの例を確認
📚 前提知識 ブラウザ(Playgroundを使う場合)
✅ このガイドで学べること
  • 買い物リストを実行し、条件を変えて比べる
  • val・data class・filter/mapを理解する
  • nullの場合の表示を決める
ひよこ ひよこ
Kotlinって、Androidアプリを作らないと試せない?
ペンギン先生 ペンギン先生
最初は短いプログラムで試せるよ。下の買い物リストをKotlin Playgroundで動かして、180円以上の商品が残るか確認しよう。アプリ開発の準備は、そのあとでも大丈夫。
ひよこ ひよこ
Javaと同じところで動くの?
ペンギン先生 ペンギン先生
Kotlin/JVMはJavaと同じJVMで動き、Javaのライブラリも使えるよ。KotlinにはJavaScriptやネイティブ向けなど別の実行対象もあるから、すべてがJVM上で動くわけではないんだ。
ひよこ ひよこ
AndroidではKotlinを覚えるといいの?
ペンギン先生 ペンギン先生
GoogleはAndroid開発をKotlin-firstとしているよ。Javaのサポートも続くので、既存アプリが全部Kotlinへ変わったわけではない。Androidへ進むなら、次にAndroid StudioやComposeの公式教材を見よう。
ひよこ ひよこ
valとvarはどう使い分けるの?
ペンギン先生 ペンギン先生
valは初期化したあと別の値を再代入しない変数、varは再代入できる変数だよ。ただしvalで参照しているリストの中身まで必ず変更できない、という意味ではないよ。
ひよこ ひよこ
商品名と価格を一緒に持たせたいな。
ペンギン先生 ペンギン先生
data classでItemの名前と価格をまとめよう。主コンストラクターのプロパティから比較や表示などの関数が生成される。copyは中身をすべて深く複製する機能ではない点も覚えておこう。
ひよこ ひよこ
null安全って、エラーが絶対に出なくなるの?
ペンギン先生 ペンギン先生
nullを取り得る型を区別して、扱い忘れを見つけやすくする仕組みだよ。!!で強制したりJavaと連携したりする場合など、NullPointerExceptionが起きることはある。
ひよこ ひよこ
?.と?:が並んでいて難しそう…。
ペンギン先生 ペンギン先生
?.は値がnullならその呼び出しをせずnullを返し、?:は左の結果がnullなら右の値を使う。例では名前が未登録なら「ゲスト」と表示するよ。
ひよこ ひよこ
この先は何を学べばいい?
ペンギン先生 ペンギン先生
まず条件や商品を変えて結果を比べよう。次に関数・コレクション・クラスを学ぶ。通信の待ち時間を扱うコルーチンは、そのあとで依存ライブラリや実行するスレッドも確認して進めよう。

最初の目標:条件に合う商品と「ゲスト」を表示する

まずは公式Kotlin Playgroundを開き、JVMの実行対象で次のコードを試します。ブラウザだけで文法を体験でき、Androidアプリやデータベースを用意する必要はありません。

data class Item(
    val name: String,
    val price: Int
)

fun main() {
    val items = listOf(
        Item("りんご", 120),
        Item("バナナ", 180),
        Item("牛乳", 250)
    )
    val selected = items.filter {
        it.price >= 180
    }
    println(
        selected.map { it.name }
    )

    val nickname: String? = null
    println(
        nickname?.uppercase() ?: "ゲスト"
    )
}

実行結果は次の2行です。

[バナナ, 牛乳]
ゲスト

最初の行は条件で選んだ商品名、2行目は名前が未登録だったときの表示です。it は、このfilterやmapで処理している1つの商品を表しています。

2か所だけ変えて、結果を予想する

価格条件を250以上にすると、商品名は [牛乳] になります。nicknameを「ひよこ」にすると、2行目は ひよこ になります。日本語のこの名前はuppercaseで見た目が変わりません。

String? はnullも持てる型、String は通常nullを持たせない型です。?. と ?: を使うと「値がなかったら何をするか」をコードへ書けます。!! はnullのとき例外になるので、確認を飛ばすために足さないようにします。

データクラスの自動生成では、主コンストラクターで宣言したプロパティが使われます。クラス本体に後から足したプロパティは同じ扱いではありません。copy() も浅いコピーなので、可変リストなどを持つ場合は参照先を共有することがあります。

val は再代入しないという約束です。val と書けばオブジェクト全体が不変になる、と覚えないようにしましょう。

手元のPCで動かしたくなったら

IntelliJ IDEAやAndroid Studioなど、公式にKotlinをサポートする開発環境を使えます。Kotlin/JVMではJDKも必要です。環境の導入手順は下の公式資料へ進みます。

コマンドライン版のコンパイラーとJDKを用意済みなら、上のコードを shopping.kt としてUTF-8で保存し、次でも実行できます。

kotlinc shopping.kt -include-runtime -d shopping.jar
java -jar shopping.jar

Playgroundで試すだけなら、このインストールは不要です。JVM向けのコードからJavaを利用するときも、Java側のnullやAPIの表現の違いを確認します。

つまずきやすい2つの思い込み

**「Sequenceへ変えれば必ず速い」**とは限りません。中間リストを減らせる一方、小さな処理では遅延処理の追加コストもあります。この3件の例では、まず読みやすいfilterとmapで結果を理解しましょう。

**「suspendと書けば自動で別スレッド」**でもありません。suspendは中断・再開できる関数の仕組みで、ブロックする処理の置き場所は別に考えます。launchやdelayなどを使う例では、通常kotlinx.coroutinesの依存設定も必要です。

Javaとの具体的な比較はJavaとKotlin、Android以外のアプリの選び方はFlutterとReact Nativeへ。まずは買い物リストの条件を変えて、自分で結果を説明できるところを目標にしましょう。

参考資料

次に学ぶなら