data classはKotlinの特別なクラス型で、データの保存専用に設計されています。コンパイラはプライマリコンストラクタで指定されたプロパティに基づいて、equals、hashCode、toString、copy、componentNメソッドを自動生成します。JetBrainsのドキュメント(2026年)によると、data classを使用すると、Javaの同等品と比較してボイラープレートコードを50~70%削減でき、Kotlinプロジェクトにおける値オブジェクトの基盤となります。
重要ポイント
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キーワードを付けて宣言します。自動メソッドに関与するすべてのプロパティはプライマリコンストラクタで指定します。
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には関与しません。
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は、プライマリコンストラクタの全プロパティの値に基づいて生成されます。data classの2つのインスタンスは、対応するすべてのプロパティが等しい場合に等しいとみなされます。
Javaでは、デフォルトのオブジェクト比較は参照比較(==)です。値による比較にはequalsのオーバーライドが必要です。Kotlinのdata classはこれを自動的に行い、構造比較に==を使用できます。
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
toStringメソッドは、すべてのプロパティの名前と値を持つオブジェクトの読みやすい表現を返します。これにより、デフォルトの出力が16進数形式のハッシュコードを表示するJavaと比較して、ロギングとデバッグが大幅に簡素化されます。
Kotlinのドキュメント(2026年)によると、data classのtoStringの形式は「User(id=1, name=John, email=john@example.com)」です。プライマリコンストラクタからプロパティを削除すると、toStringは自動的に更新され、非同期化のリスクが排除されます。
copyはdata classの重要な機能の1つです。指定したプロパティの値を変更できるシャローコピーを作成します。
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は関数型スタイルやイミュータビリティを備えたアーキテクチャで不可欠です。既存のオブジェクトを変更する代わりに、変更されたフィールドを持つ新しいコピーが作成されるため、コードの予測可能性が向上し、マルチスレッドシナリオでの安全性が高まります。
data classは、宣言順に各プロパティに対してcomponent1、component2などの関数を自動生成します。これにより、オブジェクトを変数に分解できます。
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を継承できません。ただし、通常のクラスを継承したり、インターフェースを実装したりすることはできます。
少なくとも1つのプロパティが必要です。最大数に制限はありませんが、デストラクチャリング用にcomponentNが生成されます。
いいえ、自動メソッドはプライマリコンストラクタのプロパティのみを考慮します。クラス本体のプロパティはequals、hashCode、toString、copyには関与しません。
はい、あなたはdata classの本体内でequals、hashCode、toStringをオーバーライドできます。その場合、コンパイラは独自の実装を生成しません。
data classはequals、hashCode、toString、copy、componentNを自動生成します。通常のクラスは手動実装なしではこれらのメソッドを提供しません。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。