프로퍼티는 동작이 아니라 상태를 나타내야 한다
코틀린의 프로퍼티, 자바의 필드는 둘 다 데이터를 저장한다는 점에서 같지만 프로퍼티는 더 많은 기능이 있다. 기본적으로 프로퍼티는 사용자 정의 세터와 게터를 가질 수 있다.
var name: String? = null
get() = field?.toUpperCase() //배킹 레퍼런스!
set(value) {
if (!value.isNullOrBlack()) {
field = value
}
}
var date: Date
get() = Date(millis)
set(value) {
millis = value.time
}
만약 Date를 활용한 객체가 더 이상 사용할 수 없는데 해당 프로퍼티를 많이 참조하고 있다면, millis
라는 별도의 프로퍼티에 옮겨 date 프로퍼티에 데이터를 저장하지 않고 랩/언랩할 수 있다.
프로퍼티는 get을 재정의해서 함수처럼 나타낼 수 있다.
val Tree<Int>.sum: Int
get() = when (this) {
is Leaf -> value
is Node -> left.sum + right.sum
}
위는 프로퍼티로 알고리즘을 나타낸 예시인데, 큰 컬렉션의 경우 많은 계산량이 필요할 수 있다. 하지만 관습적으로 이런 게터에 그러한 계산량이 필요하다고는 예상하지 않는다. 따라서 이런 처리는 함수로 구현해야 한다.
프로퍼티 대신 함수를 사용하는 경우
프로퍼티로 나타내는 경우
//Bad
class UserIncorrect {
private var name: String = ""
fun getName() = name
fun setName(name: String) {
this.name = name
}
}
//Good
class UserCorrect {
var name: String = ""
}