0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

ケースクラス

不変データの入れ物です。

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

Case classとは

case classは、不変データを保持するために設計された特殊な種類のクラスです。case classを使って宣言します。

Scalaが便利なコードの多くを自動生成してくれるため、case classはデータモデルを定義する標準的な方法です。

case classの宣言

パラメーターリストにフィールドを列挙するだけです。各パラメーターが不変フィールドになります。

インスタンスの作成にnewキーワードは必要ありません。

case class Point(x: Int, y: Int)
object Main {
  def main(args: Array[String]): Unit = {
    val p = Point(3, 4)
    println(p.x)
    println(p.y)
  }
}

自動生成されるtoString

case classには、クラス名とフィールドの値を表示する読みやすいtoStringが自動的に用意されます。

これにより、デバッグやロギングを簡単に行えます。

case class Point(x: Int, y: Int)
object Main {
  def main(args: Array[String]): Unit = {
    val p = Point(1, 2)
    println(p)
  }
}

値による等価性

case classは参照ではなく値によって比較されます。同じフィールドを持つ2つのインスタンスは等しいと判定されます。

通常のクラスでは、代わりに同一性によって比較されます。

case class Point(x: Int, y: Int)
object Main {
  def main(args: Array[String]): Unit = {
    val a = Point(1, 2)
    val b = Point(1, 2)
    println(a == b)
  }
}

不変フィールド

case classのフィールドはデフォルトでvalなので、再代入できません。

変更したバージョンが必要な場合は、元のインスタンスを変更するのではなく、新しいインスタンスを作成します。

case class Point(x: Int, y: Int)
object Main {
  def main(args: Array[String]): Unit = {
    val p = Point(1, 2)
    println(p.x)
  }
}

copyメソッド

すべてのcase classにはcopyメソッドがあります。新しいインスタンスを作成し、指定したフィールドだけを変更できます。

これは不変データを更新する標準的な方法です。

case class Point(x: Int, y: Int)
object Main {
  def main(args: Array[String]): Unit = {
    val p = Point(1, 2)
    val moved = p.copy(y = 99)
    println(p)
    println(moved)
  }
}

パターンマッチングのサポート

case classはmatchとシームレスに連携します。パターン内でフィールドに名前を付けることで、デコンストラクションできます。

これがcase classを使う大きな理由の1つです。

case class Point(x: Int, y: Int)
object Main {
  def describe(p: Point): String = p match {
    case Point(0, 0) => "origin"
    case Point(x, 0) => s"on x-axis at $x"
    case Point(x, y) => s"point ($x, $y)"
  }
  def main(args: Array[String]): Unit = {
    println(describe(Point(0, 0)))
    println(describe(Point(5, 0)))
    println(describe(Point(2, 3)))
  }
}

パラメーターのデフォルト値

通常のクラスと同様に、case classのパラメーターにもデフォルト値を指定できるため、インスタンス作成時に省略できます。

case class User(name: String, active: Boolean = true)
object Main {
  def main(args: Array[String]): Unit = {
    val u1 = User("Ada")
    val u2 = User("Bo", false)
    println(u1)
    println(u2)
  }
}

メソッドの追加

case classの本体には、通常のクラスと同様に独自のメソッドを定義できます。メソッドは不変フィールドに対して処理を行います。

case class Rect(w: Int, h: Int) {
  def area: Int = w * h
}
object Main {
  def main(args: Array[String]): Unit = {
    val r = Rect(3, 4)
    println(r.area)
  }
}

なぜcase classを使うのか

case classを使うと、次の機能を自動的に利用できます。

  • 不変フィールドを持つ簡潔なコンストラクター
  • 読みやすいtoString
  • 値に基づくequalsとhashCode
  • copyメソッド
  • 第一級のパターンマッチング

Scalaでデータをモデル化するための基盤となる機能です。

まとめて使う

この例では、case classの作成、コピー、比較、パターンマッチングをまとめて行います。

case class Money(amount: Int, currency: String)
object Main {
  def main(args: Array[String]): Unit = {
    val price = Money(10, "USD")
    val sale = price.copy(amount = 8)
    println(price == sale)
    sale match {
      case Money(a, "USD") => println(s"$a dollars")
      case Money(a, c)     => println(s"$a $c")
    }
  }
}

理解度チェック

case classについての理解度を確認しましょう。

まとめ

case classは、ヘルパーが自動生成される不変データをモデル化するものだと学びました。

  • newなしで構築でき、フィールドは不変のvalです
  • toString、値に基づくequals/hashCodeが自動的に利用できます
  • copyで変更した複製を作成できます
  • パターンマッチングが組み込みでサポートされています
  • デフォルト値やカスタムメソッドも定義できます

よくある質問

「ケースクラス」レッスンは無料ですか?

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

「ケースクラス」で何を学びますか?

不変データの入れ物です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

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

「ケースクラス」レッスンにはどのくらい時間がかかりますか?

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

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

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

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

  1. ケースクラス
  2. Sealed トレイト
  3. 代数的データ型
  4. 網羅的マッチング
← Scala for Backend Engineering & Functional Programmingに戻る