Y&S SoftWareのホームページ
使いかってのいいソフトウェアを開発します

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 が役立ちます。