프로퍼티는 동작이 아니라 상태를 나타내야 한다. #
코틀린의 프로퍼티는 자바의 필드랑 비슷해 보이지만, 서로 완전히 다른 개념이다.
둘 다 데이터를 저장한다는 점은 같다. 하지만 프로퍼티에는 더 많은 기능이 있다.
프로퍼티 #
- 사용자 정의 getter/setter 가질 수 있다.
- val 프로퍼티에는 백킹 필드가 만들어지지 않는다.
- 필드가 필요 없다. 프로퍼티는 개념적으로 ‘접근자’를 나타낸다.
- 따라서 코틀린에서는 인터페이스에서도 프로퍼티를 정의할 수 있다. (아래 ‘예시 1’ 참고)
- 위임(property delegate)할 수 있다.
- 프로퍼티는 본질적으로 함수이다.
- 확장 프로퍼티를 만들 수 있다.
- 프로퍼티를 함수 대신 사용할 수도 있지만, 그렇다고 완전히 대체해서 사용하는 것은 좋지 않다. (아래 ‘예시 2’ 참고)
// 예시 1. 인터페이스에서도 프로퍼티를 정의할 수 있다.
interface Person {
val name: String // getName() (getter)
}
// 예시 2. 함수를 완전히 대체하는 것은 좋지 않다.
// 이유 : 관습적으로 게터에 알고리즘, (무거운)계산 등의 로직이 들어갈 것이라고 생각하지 않는다.
val Tree<Int>.sum: Int
get() = when(this) {
is Leaf -> value
is Node -> left.sum + right.sum
}
원칙적으로 프로퍼티는 상태(state)를 표현하거나 설정하기 위한 목적으로만 사용하는 것이 좋다. 다른 로직 등을 포함하지 않는 것이 좋다.
ㄴ 이런 관점에서는 ‘필드’처럼 사용되는 것 같다.
" 많은 사람은 경험적으로 프로퍼티는 상태 집합을 나타내고, 함수는 행동을 나타낸다고 생각한다. “
이전 장에서 본 인식 부하 감소(인지 부하 감소) 내용을 기억해보면, 충분히 이해된다.