데이터 집합 표현에 data 한정자를 사용하라

데이터 집합 표현에 data 한정자를 사용하라

data 한정자를 붙이면 toString, equalsAndHashCode, copy, componentN이 자동으로 생성된다.

component

위 기능은 객체의 해체로 위치를 기반으로 객체를 해체할 수 있게해준다.

  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 클래스는 프로퍼티의 값을 명확하게 알 수 있다.

Last updated