データクラスとシールドクラスの違いと活用方法を徹底解説【Kotlin入門⑥】

データクラスとは?

データクラスの基本

データクラス(data class)は、主にデータを保持するためのクラスであり、Kotlinで非常に便利な機能の一つです。通常のクラスとは異なり、データクラスはequalshashCodetoStringcopycomponentNといったメソッドが自動的に生成されるため、データ管理が簡単になります。

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

fun main() {
    val user1 = User("Alice", 25)
    val user2 = User("Alice", 25)
    println(user1 == user2)  // 出力: true (データが同じなら等しいと判断される)
}

データクラスの主な特徴

  • equalshashCode が自動生成され、オブジェクトの比較が簡単。
  • toString が自動生成され、オブジェクトの内容を簡単に表示可能。
  • copy メソッドで、オブジェクトを簡単に複製し、特定のプロパティのみ変更可能。
  • componentN メソッドを使用し、データの分解が可能。
val user3 = user1.copy(age = 30)  // age だけ変更して新しいオブジェクトを作成
println(user3)  // 出力: User(name=Alice, age=30)

データクラスの制約

データクラスにはいくつかの制約があります。

  • プライマリコンストラクタに1つ以上のプロパティを持つこと。
  • クラスはabstractopensealedinnerのいずれかを持つことはできない。
  • データクラスは継承できないが、インターフェースの実装は可能。

シールドクラス(sealed class)とは?

シールドクラスの基本

シールドクラス(sealed class)は、特定のクラス階層を制限するためのクラスで、通常は状態の管理や分岐処理を簡潔に記述するために使われます。sealedキーワードを使うことで、同じファイル内でのみ派生クラスを定義できるため、安全に型チェックを行えます。

sealed class Result {
    class Success(val data: String) : Result()
    class Error(val message: String) : Result()
}

fun handleResult(result: Result) {
    when (result) {
        is Result.Success -> println("Success: ${result.data}")
        is Result.Error -> println("Error: ${result.message}")
    }
}

シールドクラスの主な特徴

  • 継承可能だが、派生クラスは同じファイル内に限定される。
  • when式で型チェックを安全に行えるため、分岐処理が簡単になる。
  • データの状態を安全に管理できる。

シールドクラスの活用例

シールドクラスは、APIのレスポンスや状態管理に適しています。

sealed class NetworkState {
    object Loading : NetworkState()
    class Success(val data: String) : NetworkState()
    class Failure(val error: String) : NetworkState()
}

fun handleNetworkState(state: NetworkState) {
    when (state) {
        is NetworkState.Loading -> println("Loading...")
        is NetworkState.Success -> println("Data: ${state.data}")
        is NetworkState.Failure -> println("Error: ${state.error}")
    }
}

データクラスとシールドクラスの違い

比較項目データクラスシールドクラス
目的データの保持状態の管理や型制限
equalscopy自動生成される手動で実装する必要がある
継承できないできる(ただし同じファイル内に限定)
when の使用可能だが限定的whenで型チェックが強力

データクラスは「データを保持するためのシンプルなクラス」として使い、シールドクラスは「特定の状態や振る舞いを管理するクラス」として活用するとよいでしょう。

まとめ

本記事では、データクラスとシールドクラスの基本と違いについて詳しく解説しました。

  • データクラスは、データの保持に適しており、equalscopyなどが自動生成される。
  • シールドクラスは、状態管理に適しており、when式を使った分岐処理が簡単に記述できる。

適切な場面でこれらの機能を使い分けることで、Kotlinのオブジェクト指向プログラミングをより効果的に活用できます。

次回は、Kotlinのコレクション操作と拡張関数について詳しく解説します!