Kotlin data class(データクラス)の使用方法

kotlin data class(データクラス)の使用方法

ENGINEER.CLUB編集部

ENGINEER.CLUB編集部

Kotlinのdata classとは、データを保持する役割のクラスに使う記法のことです。データにアクセスするための関数・比較のための関数を自動で生成する、クラスを発展させた物です。そんなdata classについて本記事では解説していくので一緒に学んでいきましょう。


1.data classとは

Kotlinでは、データを扱うための便利な機能として、data class(データクラス)が用意されています。


2.Kotlinにおけるdata classのサンプル

data classを使うには、クラス名の前にdataキーワードを付けます。また、プライマリコンストラクタに少なくとも1つ以上のプロパティを宣言する必要があります。例えば、以下のようにPersonクラスを定義できます。

data class Person(val name: String, var age: Int)


val taro = Person("Taro", 20)
val jiro = Person("Jiro", 25)

// equals()やtoString()メソッドを使った例
println(taro == jiro) // false
println(taro.toString()) // Person(name=Taro, age=20)

// 分割代入
val (name, age) = taro 
println(name) // Taro
println(age) // 20

// コピーを作成
val jugemu = taro.copy(name = "Jugemu") 
println(jugemu) // Person(name=Jugemu, age=20)

2-1.data classの宣言方法

data classを宣言する際には、以下のルールに従う必要があります。

  •  クラス名の前にdataキーワードを付ける
  • プライマリコンストラクタに少なくとも1つ以上のプロパティを宣言する
  • プロパティはval(読み取り専用)かvar(読み書き可能)であること
  • プロパティはカスタムアクセサーを持たないこと
  • プロパティはopenoverrideabstractlateinitなどの修飾子を持たないこと

2-2.copyメソッドの使い方

data class Person(val name: String, val age: Int, val address: String)

val taro = Person("Taro", 20, "Tokyo")
val jiro = taro.copy(name = "Jiro") // Taroと同じ年齢と住所で、名前だけJiroにしたオブジェクトを作る
println(taro) // Person(name=Taro, age=20, address=Tokyo)
println(jiro) // Person(name=Jiro, age=20, address=Tokyo)

copyメソッドは、プライマリコンストラクタで宣言されたプロパティに対応する引数を持ちます。引数を指定しない場合は、元のオブジェクトと同じ値が使われます。引数を指定する場合は、その値でプロパティが上書きされます。

copyメソッドは、データクラスのオブジェクトを不変に扱いたい場合や、一部の値だけ変えたい場合に便利です。

2-3.equalsメソッドの注意点

equalsメソッドは、オブジェクト同士の等価性を判定するためのメソッドです。Kotlinでは、オブジェクトに対して==!=を適用すると、内部的にequalsメソッドの呼び出しに変換されます。しかしプロパティに配列が使われている場合は内部の要素が一致していてもオブジェクトとして見ると一致していないため、falseが返ってきます。そのためIDEでのequalsメソッドの生成処理等を使用して、正しいequalsメソッドをオーバーライドするようにしてください。その際hashCodeメソッドもオーバーライドすることを忘れないようにしましょう。

2-4.interfaceの実装方法

データクラスは、インターフェースを実装することができます。

インターフェースを実装する場合は、インターフェースで定義されたメソッドやプロパティをデータクラスでオーバーライドして、実装する必要があります。例えば、以下のようなインターフェースがあるとします。

interface Printable {
    fun print()
}
// このインターフェースを実装するデータクラスは以下のようになります。
data class User(val name: String, val age: Int) : Printable {
    override fun print() {
        println("User(name=$name, age=$age)")
    }
}

2-5.分解宣言

データクラスは、分解宣言という機能をサポートしています。分解宣言とは、データクラスのオブジェクトを、プライマリコンストラクタで宣言されたプロパティの値に分解して、別々の変数に代入することです。分解宣言をするには、以下のように書きます。

val user = User("Taro", 20)
val (name, age) = user
println(name) // Taro
println(age) // 20

3.その他標準のデータクラス

Kotlinでは、標準ライブラリでいくつかのデータクラスが提供されています。これらのデータクラスは、一般的な用途に便利なものです。ここでは、PairTripleという2つのデータクラスについて紹介します。

3-1.Pair

Pairは、2つの値を保持するためのデータクラスです。Pairは以下のように定義されています。

data class Pair(
    val first: A,
    val second: B
) : Serializable
//Pairオブジェクトを作るには以下のように書くことができます。
val pair = Pair("Taro", 20)
println(pair.first) // Taro
println(pair.second) // 20

3-2.Tripl

Tripleは、3つの値を保持するためのデータクラスです。Tripleは以下のように定義されています。

data class Triple(
    val first: A,
    val second: B,
    val third: C
) : Serializable

val triple = Triple("Taro", 20, "Tokyo")
println(triple.first) // Taro
println(triple.second) // 20
println(triple.third) // Tokyo

 


4.まとめ

この章では、Kotlinのデータクラスについて学びました。データクラスは、データを保持するためのクラスであり、equalsメソッドやhashCodeメソッドなどを自動的に生成してくれます。

データクラスはインターフェースを実装したり、分解宣言をサポートしたりすることもできます。

また、標準ライブラリで提供されているPairTripleという2つのデータクラスについて紹介しました。これらのデータクラスは、2つや3つの値を関連付けて返したいときに便利です。

データクラスは、Kotlinの便利な機能の一つです。データを扱うときには、ぜひ活用してみてください。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め定年まで働けるエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって、エンジニアとしてだけでなくビジネスパーソンとして高い水準を目指し、社会や顧客に必要とされることで、関わる人々に感動を与える集団であろうと思っています。

  • 定年までIT業界で働くためのスキルが身につく「感動大学」と「技術勉強会」!
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な「人事評価制度」!
  • 理想のエンジニア像に近づくためのよきアドバイザー「専任コーチ制度」!
  • 稼動確認の徹底により実現できる平均残業時間17時間の働きやすい環境!

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

公式アカウントLINE限定!ボールドの内定確率が分かる無料診断実施中
公式アカウントLINE限定!
ボールドの内定確率が分かる無料診断実施中