본문 바로가기

Reading Record/이펙티브 코틀린

[이펙티브 코틀린] Item 37. 데이터 집합 표현에 data 한정자를 사용하라

아이템 37

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

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

  • 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 클래스는 프로퍼티의 값을 명확하게 알 수 있다.
    • 성과 이름을 구분하기 쉽다.