아이템 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 클래스는 프로퍼티의 값을 명확하게 알 수 있다.
- 성과 이름을 구분하기 쉽다.
'Reading Record > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item 45. 불필요한 객체 생성을 피하라 (0) | 2022.06.12 |
---|---|
[이펙티브 코틀린] Item 38. 연산 또는 액션을 전달할 때는 인터페이스 대신 함수 타입을 사용하라 (0) | 2022.06.07 |
[이펙티브 코틀린] Item 36. 상속보다는 컴포지션을 사용하라 (0) | 2022.06.07 |
[이펙티브 코틀린] Item 35. 복잡한 객체를 생성하기 위한 DSL을 정의하라 (0) | 2022.06.07 |
[이펙티브 코틀린] Item 34. 기본 생성자에 이름 있는 옵션 아규먼트를 사용하라 (0) | 2022.06.07 |