데이터 보관을 목적으로 만들어진 클래스로서 생성자 프로퍼티에 대한 toString, equals, hashCode, copy, compoenetsN 메소드를 자동으로 생성해준다.
기본 모양은 아래와 같다. class 키워드 앞에 data라는 키워드를 붙임으로써 사용할 수 있다.
data class Site(val url: String, val title: String) {
val description = ""
}
특징은 아래와 같다
독특한 점이 데이터 클래스를 상속받을 수 없다는점. 그리고 웬만하면 데이터 클래스는 상속받아 구현하지 말라고들 한다. 왜일까?
예를들면 아래와 같은 상황이 있다.
open class SuperUser(var gender: Int = 0)
data class User(val age: Int, val name: String) : SuperUser(0)
상기 코드는 data 클래스의 프로퍼티로 super 클래스의 프로퍼티가 포함되지 않았다. 따라서 gender는 User 클래스의 hashCode, equals 등에 영향을 주지 않는다. 이말인 즉슨 gender의 값이 변경되더라도 User 클래스는 동등하다라고 계산될 수 있다는 것. 이런면을 방지하고자, 상속을 제한하고 있는것이다.
굳이 상속을 써야 한다면?
추상클래스나 인터페이스등으로 상속해야 한다.
abstract class SuperUser { abstract var gender: Int }
data class User(val age: Int, val name: String, override var gender: Int) : SuperUser()
프로퍼티를 추상화 함으로써 생성자에 포함될 수 있도록 해야 정확한 동등성 비교가 가능할 것이다.