Daha önceden bir sınıfın (class), ne olduğunu buradaki yazıda belirtmiştim. Aslında, data class normal bir classtan farklı değildir. Ancak, data classlar bazı durumda bize kolaylık sağlarlar.

class Kisi(var No:Int, var Ad:String)
{
 
}

fun main(args: Array<String>)
{
   var baris:Kisi = Kisi(1, "Barış")
   var yunus:Kisi = Kisi(2, "Yunus")
   var KopyaBaris = baris
   var baris2:Kisi = Kisi(1, "Barış")
    
    println(baris.toString())
    println(yunus.toString())
    println(baris2.toString())
    println(baris.equals(yunus))
    println(baris.equals(baris2))   
   
}


Yukarıdaki kodumuzu inceleyelim. Kisi adında constructor içeren class tanımladım. main() metodunda da yeni nesneler oluşturdum. Dikkat edilirse, kodumuz aşağıdaki çıktıyı verecektir. 

Kisi@37f8bb67
Kisi@439f5b3d
Kisi@1d56ce6a
false
false

ilk üç sonuç toString() metodunu bu nesneler için çağırdığımızda saçma bir değer döndürdü. Bunun sebebi toString() metodunu override etmememiz. Çünkü burada classımızda herhangi bir şey olmadığı için ilgili nesneyi yazdırdığımızda üst sınıf olan (süper) any sınıfını çağırmakta. Classımız içerisinde toString() metodunu override yapalım.

class Kisi(var No:Int, var Ad:String)
{
  override fun toString() : String
    {
        return "$No $Ad"
    }
}

fun main(args: Array<String>)
{
   var baris:Kisi = Kisi(1, "Barış")
   var yunus:Kisi = Kisi(2, "Yunus")
   var KopyaBaris = baris
   var baris2:Kisi = Kisi(1, "Barış")
    
    println(baris.toString())
    println(yunus.toString())
    println(baris2.toString())
    println(baris.equals(yunus))
    println(baris.equals(baris2))   
   
}


toString() metodu için override işlemi gerçekleştirdik. Peki, şimdi uygulamamızın çıktısı ne?
1 Barış
2 Yunus
1 Barış
false
false

Burada dikkat edilirse baris ve baris2 nesneleri aynı değerleri içermekte, ancak en sondaki kodumuzda baris.equals(baris2) olan kısımda neden false değerini döndürdü? İşte burada data class ile normal class arasındaki fark ortaya çıkıyor. Çünkü, baris2 nesnesi baris nesnesi RAM bellekte aynı öğeye gitmiyor. Burada baris2 nesnesini aynı parametrelerle bile oluştursak farklı bir konuma gidiyor. Dikkat edilirse, ilk örneğimizde baris için “Kisi@439f5b3d” çıktısı verilirken (RAM üzerindeki referans) baris2 için “Kisi@1d56ce6a” çıktısı döndürülmekte, değerleri aynı olsa bile ayrı konumlandırılmaktadırlar.

dataclass

Şimdi aynı örneği data class kullanarak yapalım.

data class Kisi(var No:Int, var Ad:String)
{

}

fun main(args: Array<String>)
{
   var baris:Kisi = Kisi(1, "Barış")
   var yunus:Kisi = Kisi(2, "Yunus")
   var KopyaBaris = baris
   var baris2:Kisi = Kisi(1, "Barış")
    
    println(baris.toString())
    println(yunus.toString())
    println(baris2.toString())
    println(baris.equals(yunus))
    println(baris.equals(baris2))   
}


Kodumuzun çıktısını inceleyelim;

Kisi(No=1, Ad=Barış)
Kisi(No=2, Ad=Yunus)
Kisi(No=1, Ad=Barış)
false
true

görüldüğü üzere, toString() metodunu override etmedim ilk üç çıktımız ilk örnekteki gibi saçma bir değer döndürmedi. Ayrıca, baris.equals(baris2) değerini true olarak döndürdü. Yani, birbirine eşit olduğunu gösterdi. 

dataclass2


Görüldüğü gibi data class olarak tanımladığımda aynı değeri alan iki nesne RAM üzerinde aynı noktada tutulmaktadır. Ayrıca sonuç olarak, data classlar bize kolaylıklar sağlar. Örneğin ilk örnekte toString() metodu için override etmek gerekirken, data class olarak tanımladığımızda buna ihtiyaç yoktur.