data class とは
data class とは何か?Kotlin の データ保持専用クラス です。
data class User(val id: Int, val name: String)
普通の class と違うのは、コンパイラが自動で以下を作ってくれる点です
equals()(内容が同じなら等しいと判断)
hashCode()
toString()(内容を文字列化)
copy()(フィールドをコピーして新しいオブジェクトを作る)
componentN()(分解宣言 val (id, name) = user を可能にする)
なので、単なるデータを持つためのクラスは data class が基本 です。
1. equals()
内容が同じなら等しいとみなす
val a = NoteTitle(1, "Hello")
val b = NoteTitle(1, "Hello")
println(a == b) // data class → true
メリット
「同じデータかどうか」を簡単に比較できる
UI の差分更新(例:Jetpack Compose の LazyColumn の diffing)で便利
コレクション検索やフィルタに使いやすい
2. hashCode()
equals() とセットで、ハッシュ集合(HashSet / HashMap など)で正しく動くようにする。
メリット
Set に入れたときに「同じデータは1個だけ」と自動で判定してくれる
Map のキーにできる
val set = hashSetOf(NoteTitle(1, "A"))
set.add(NoteTitle(1, "A")) // data class なら重複せず1個だけ
3. toString()
内容を自動で文字列化。
val note = NoteTitle(1, "Hello")
println(note)
// data class → NoteTitle(id=1, title=Hello)
メリット
デバッグが圧倒的に楽
ログ出力時に中身を一瞬で確認できる
手書きで toString() を実装する手間が不要
4. copy()
元のデータをベースに一部だけ変更した新オブジェクトを作れる。
val note = NoteTitle(1, "Hello")
val newNote = note.copy(title = "World")
メリット
イミュータブル(変更不可)なデータ管理がしやすい
Redux / MVVM / Clean Architecture のような 状態管理 で必須級
参照のバグ(同じオブジェクトを直接変更してしまう問題)を防げる
5. componentN()
分解宣言を自動で使える。
val (id, title) = NoteTitle(1, "Hello")
println(id) // 1
println(title) // Hello
メリット
一時変数をシンプルに書ける
DBやAPIから取ってきたデータをサッと展開できる
🔑 まとめ
equals / hashCode → コレクションや比較に強い
toString → デバッグが楽
copy → 安全なデータ変更に便利
componentN → 分解代入でコードが読みやすい
👉 実際に Android アプリで使うとすると、
Room + Jetpack Compose の場合は特に equals / copy / toString が役立ちます。