Kotlinのdata class — その概要、構文、データクラスの特徴

著者: IT Sectr 公開日: 2026-06-20 読了時間: 10 分

data classはKotlinの特別なクラス型で、データの保存専用に設計されています。コンパイラはプライマリコンストラクタで指定されたプロパティに基づいて、equals、hashCode、toString、copy、componentNメソッドを自動生成します。JetBrainsのドキュメント(2026年)によると、data classを使用すると、Javaの同等品と比較してボイラープレートコードを50~70%削減でき、Kotlinプロジェクトにおける値オブジェクトの基盤となります。

重要ポイント

  • data — Kotlinでデータクラスを宣言するためのキーワード
  • equalsとhashCode — プライマリコンストラクタの全プロパティに基づいて自動生成
  • copy — 個別のフィールドを置き換え可能なシャローコピー関数
  • componentN — data classを個別の変数に分解するデストラクチャリング
  • プライマリコンストラクタには少なくとも1つのvalまたはvarパラメータが必要

Kotlinのdata classとは?

data classは、データの保存を主目的とするクラスに対して標準メソッドを自動生成するKotlinの構文構造です。data classを宣言すると、コンパイラはプライマリコンストラクタの全プロパティに基づいて、equals、hashCode、toString、copy、componentNの実装を作成します。

開発者がIDEやLombokなどのライブラリを使ってgetter、setter、equals、hashCode、toStringを手作業で記述する必要があるJavaの通常クラスとは異なり、Kotlinは組み込みのメカニズムを提供します。これによりコードが削減されるだけでなく、一貫性も保証されます。自動メソッドは常に現在のプロパティ構造に対応します。

JetBrains Kotlin Survey(2025年)によると、data classはKotlinプロジェクトの78%で使用されており、言語の最も需要の高い機能の1つとなっています。特にDTO、API応答モデル、MVVMの状態オブジェクトを用いるアーキテクチャで人気があります。

構文と基本機能

data classは、classの前にdataキーワードを付けて宣言します。自動メソッドに関与するすべてのプロパティはプライマリコンストラクタで指定します。

kotlin
data class User(
    val id: Int,
    val name: String,
    val email: String
)

1行のコードで、Javaの何十行ものボイラープレートを置き換えます。コンパイラは3つのプロパティすべてに対してequals、hashCode、toString、copy、component1~component3を生成します。

プライマリコンストラクタ外のプロパティ

自動メソッドにはプライマリコンストラクタのプロパティのみが含まれます。クラス本体でプロパティを宣言しても、equals、hashCode、toString、copyには関与しません。

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice is NOT included in equals/hashCode/copy
}

プライマリコンストラクタの制限

data classのプライマリコンストラクタには少なくとも1つのパラメータが必要です。すべてのパラメータはvalまたはvarとしてマークする必要があります。data classにopen、abstract、sealed、innerの各修飾子は使用できません。

自動メソッドequals、hashCode、toString

equalsとhashCodeは、プライマリコンストラクタの全プロパティの値に基づいて生成されます。data classの2つのインスタンスは、対応するすべてのプロパティが等しい場合に等しいとみなされます。

値比較のためのequals

Javaでは、デフォルトのオブジェクト比較は参照比較(==)です。値による比較にはequalsのオーバーライドが必要です。Kotlinのdata classはこれを自動的に行い、構造比較に==を使用できます。

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // true

デバッグのためのtoString

toStringメソッドは、すべてのプロパティの名前と値を持つオブジェクトの読みやすい表現を返します。これにより、デフォルトの出力が16進数形式のハッシュコードを表示するJavaと比較して、ロギングとデバッグが大幅に簡素化されます。

Kotlinのドキュメント(2026年)によると、data classのtoStringの形式は「User(id=1, name=John, email=john@example.com)」です。プライマリコンストラクタからプロパティを削除すると、toStringは自動的に更新され、非同期化のリスクが排除されます。

copy関数とデストラクチャリング

copyはdata classの重要な機能の1つです。指定したプロパティの値を変更できるシャローコピーを作成します。

kotlin
data class Order(
    val id: Long,
    val status: String,
    val amount: Double
)

val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"

copyは関数型スタイルやイミュータビリティを備えたアーキテクチャで不可欠です。既存のオブジェクトを変更する代わりに、変更されたフィールドを持つ新しいコピーが作成されるため、コードの予測可能性が向上し、マルチスレッドシナリオでの安全性が高まります。

componentNによるデストラクチャリング

data classは、宣言順に各プロパティに対してcomponent1、component2などの関数を自動生成します。これにより、オブジェクトを変数に分解できます。

kotlin
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)")  // "1: Alice (alice@example.com)"

デストラクチャリングはラムダやfor-eachループでも機能し、data classをコレクションの操作に便利にします。

制限事項と推奨事項

1つ目の制限 — data classは別のdata classからの継承をサポートしません。通常のクラスまたはインターフェースからのみ継承できます。

2つ目 — 自動メソッドにはプライマリコンストラクタのプロパティのみが含まれます。クラス本体内のプロパティは無視されるため、これを忘れるとequalsが正しく動作しない可能性があります。

3つ目 — data classはopen、abstract、sealed、innerにできません。常にfinalです。

4つ目 — data class内のコレクションに対して、copyはシャローコピーを実行します。コピーされたコレクション内の要素を変更すると、元のオブジェクトにも影響します。

Kotlinのベストプラクティス(2026年)によると、data classはDTO、APIモデル、値オブジェクト、状態オブジェクトに最適です。ビジネスロジックを持つコンポーネントには、通常のクラスを使用することをお勧めします。

よくある質問

data classは別のdata classを継承できますか?

いいえ、data classは別のdata classを継承できません。ただし、通常のクラスを継承したり、インターフェースを実装したりすることはできます。

プライマリコンストラクタにはいくつのプロパティが必要ですか?

少なくとも1つのプロパティが必要です。最大数に制限はありませんが、デストラクチャリング用にcomponentNが生成されます。

クラス本体のプロパティはequalsに影響しますか?

いいえ、自動メソッドはプライマリコンストラクタのプロパティのみを考慮します。クラス本体のプロパティはequals、hashCode、toString、copyには関与しません。

自動メソッドを手動でオーバーライドできますか?

はい、あなたはdata classの本体内でequals、hashCode、toStringをオーバーライドできます。その場合、コンパイラは独自の実装を生成しません。

data classは通常のクラスとどう違いますか?

data classはequals、hashCode、toString、copy、componentNを自動生成します。通常のクラスは手動実装なしではこれらのメソッドを提供しません。

まとめ

  • data class — 自動生成メソッドでデータを保存するためのKotlinの構文構造
  • equalsとhashCode — プライマリコンストラクタのプロパティに基づく構造比較
  • toString — デバッグとロギングのためのオブジェクトの可読表現
  • copy — 名前付き引数による個別フィールドの置き換えが可能なシャローコピー
  • componentN — コレクション操作を容易にするオブジェクトの変数への分解
  • 制限 — デフォルトでfinal、1つ以上のプロパティ必須、data→dataの継承不可
  • 用途 — DTO、APIモデル、値オブジェクト、MVVMの状態

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください