데이터 집합 표현에 data 한정자를 사용하라
data 한정자를 붙이면 toString, equalsAndHashCode, copy, componentN이 자동으로 생성된다.
위 기능은 객체의 해체로 위치를 기반으로 객체를 해체할 수 있게해준다.
val person = Person(1, "cys")
val (id, name) = person
val id2 = person.component1()
val name2 = person.component2()
해체는 변수의 이름을 원하는 대로 지정할 수 있다는 장점을 가진다.
list, map.entry등을 원하는 형태로 분해 가능하다.
하나만 갖는 데이터 클래스는 아래와 같은 상황이 발생할 수 있으므로 해제하지 않는것이 좋다
val user = User("cys")
user.let { a-> print(a) } // User(name=cys)
user.let { (a)-> print(a) } // cys
튜플은 데이터 클래스와 같은 역할을 하지만, 나쁜 가독성을 지니고 있다.
data class FullName(val first:String,val last: String)
fun String.parseNameTuple(): Pair<String,String>?{
val indexOfLastSpace = this.trim().lastIndexOf(" ")
if(indexOfLastSpace < 0) return null
val first = this.take(indexOfLastSpace)
val last = this.dropLast(indexOfLastSpace)
return Pair(first,last)
}
fun String.parseNameData(): FullName?{
val indexOfLastSpace = this.trim().lastIndexOf(" ")
if(indexOfLastSpace < 0) return null
val first = this.take(indexOfLastSpace)
val last = this.dropLast(indexOfLastSpace)
return FullName(first,last)
}
데이터 클래스를 만든다 해도 추가비용은 거의 발생하지 않는다.
함수의 리턴타입이 더 명확해진다.
리턴 타입이 짧아지며, 전달하기 쉬워진다.
Pair의 값과 달리 data 클래스는 프로퍼티의 값을 명확하게 알 수 있다.