case classes are datacentric.
We get following advantages by using case class over regular classes.
(1) Value equivalence : It means that two case instances can be compared against values inside them.
scala> case class Time(hours: Int = 0, mins: Int = 0)
defined class Time
scala> val time1 = Time(12, 13)
time1: Time = Time(12,13)
scala> val time2 = Time(11, 12)
time2: Time = Time(11,12)
scala> time1 == time2
res6: Boolean = false
scala> val time3 = Time(10, 11)
time3: Time = Time(10,11)
scala> time1 == time2
res7: Boolean = false
But other comparison operators(>, >= <, etc) are not defined.
(2) Immutable Fields: Thread-safe
(3) Automatic field creation: hours and minutes are immutable fields automatically created by Scala.
scala> time1.hours
res9: Int = 12
case classes are also used in parsing spark DataFrame rows and advantage is that columns of DataFrame can be accessed by field name of case class.