Kotlin Academy · レッスン

copyとequals

自動生成される関数を学びます

レッスン 2/413 ステップ

「copyとequals」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

自動生成される関数

toString に加えて、データクラスではequals、hashCode、copyが生成されます。

この3つによって、データクラスは比較や複製を簡単に行える便利なものになります。

構造的等価性

自動生成される equals は、オブジェクトの同一性ではなくプロパティの値によって比較します。

同じ値を持つ2つのデータクラスのインスタンスは、== で等しいと判定されます。

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 30)
    println(a == b)
}

値が異なれば等しくない

いずれかのプロパティを変更すると、オブジェクトは等しくなくなります。

等価性は、プライマリコンストラクターのすべてのプロパティから計算されます。

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 31)
    println(a == b)
}

等価性と同一性

値による等価性(構造的等価性)には == を、参照による等価性(同一性)には === を使います。

等しい2つのデータオブジェクトが、メモリ上では異なるインスタンスである場合もあります。

data class User(val name: String)

fun main() {
    val a = User("Alice")
    val b = User("Alice")
    println(a == b)  // values match
    println(a === b) // different instances
}

一貫性のあるhashCode

hashCode は equals と一致するように生成されます。等しいオブジェクトは同じハッシュ値を返します。

これにより、データクラスを集合やマップのキーとして正しく使用できます。

data class Point(val x: Int, val y: Int)

fun main() {
    val a = Point(1, 2)
    val b = Point(1, 2)
    println(a.hashCode() == b.hashCode())
}

copy関数

copy は、元のオブジェクトと同じ内容を持つ新しいオブジェクトを作成します。

不変の val プロパティを使っている場合、変更したバージョンを作るにはコピーを使用します。

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy()
    println(b)
    println(a == b)
}

変更を加えてコピーする

copy に名前付き引数を渡すと、残りのプロパティを維持したまま特定のプロパティを変更できます。

これは、不変データを更新するための標準的なパターンです。

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val older = a.copy(age = 31)
    println(a)
    println(older)
}

copyは元のオブジェクトを変更しない

copy が元のオブジェクトを変更することはありません。元のオブジェクトは値を保持し続けます。

この不変性により、状態の変更を予測しやすく安全に扱えます。

data class Account(val owner: String, val balance: Int)

fun main() {
    val original = Account("Sam", 100)
    val updated = original.copy(balance = 150)
    println(original.balance)
    println(updated.balance)
}

コピーの連鎖

copy は新しいオブジェクトを返すため、複数の更新を順番に適用できます。

各ステップで、新しく独立した値が生成されます。

data class Config(val volume: Int, val muted: Boolean)

fun main() {
    val base = Config(50, false)
    val result = base.copy(volume = 70).copy(muted = true)
    println(result)
}

対象になるのはコンストラクターのプロパティだけ

等価性と同じように、copy が扱うのはプライマリコンストラクターのプロパティだけです。

本体のプロパティはコピー先でデフォルト値に戻るため、重要な状態はコンストラクターに保持してください。

data class User(val name: String) {
    var note: String = "none"
}

fun main() {
    val a = User("Alice")
    a.note = "VIP"
    val b = a.copy()
    println(b.note) // back to default
}

まとめて確認

自動生成される関数によって、データクラスは強力な機能を持ちます。

  • equals と == は値によって比較します
  • hashCode はequalsと一貫性を保ちます
  • copy は必要に応じて変更を加えながら複製します
data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy(name = "Alicia")
    println(a == b)
    println(b)
}

理解度チェック

copyとequalsの理解度を確認しましょう。

まとめ

データクラスで自動生成される関数を学びました。

  • equals は値で比較し、== と === は使い分けます
  • hashCode はコレクションで一貫性を保ちます
  • copy は選択的に変更を加えながら複製します

次は、分割代入によってオブジェクトを変数に展開する方法を学びます。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「copyとequals」レッスンは無料ですか?

はい。「copyとequals」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「copyとequals」で何を学びますか?

自動生成される関数を学びます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「copyとequals」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. データクラスの宣言
  2. copyとequals
  3. 分解宣言
  4. コレクション内のデータクラス
← Kotlin Academyに戻る