엄범


프로퍼티 = 필드 + 접근자

클래스 내부의 변수 선언은 자바에서는 필드 선언을 의미하지만 코틀린에서는 프로퍼티 선언을 의미한다. 즉, 필드 뿐만 아니라 접근자 메서드도 알아서 생성해준다.
```kt
class Person(
    val name: String,       // val은 읽기 전용 프로퍼티. private 필드와 getter.
  var isMarried: Boolean  // private 필드와 getter, setter.
)
```
* 이렇게 메소드 없이 프로퍼티만 존재해 데이터만 저장하는 용도의 클래스를 값-객체(value-object)라고 하며, ``kt data`` 키워드를 사용해 data Class로 구성하는 것이 좋다.

Person class를 자바에서 호출할 때

```java
person.getName()
person.isMarried() 
person.setMarried(true)
```
* `` is``로 시작하는 프로퍼티의 게터에는 `` get``이 붙는게 아니라 그냥 `` is``를 사용한다.

Person class를 코틀린에서 호출할 때

프로퍼티 이름을 직접 사용해도 자동으로 getter, setter 호출로 변환해준다.
```kt
person.name
person.isMarried = true
```
* 반대로 자바로 작성한 클래스도 프로퍼티 명명 형식을 맞춰 준다면  코틀린 클래스 프로퍼티처럼 사용할 수 있다.

커스텀 접근자

단순히 값을 반환하는 접근자가 아니라 특정 연산을 수행한 결과를 반환해야 하는 경우라면, 접근자를 직접 작성할 수 있다.
```kt
val  isSquare: Boolean
    get() = height == width
```
이렇게 호출될 때 마다 계산해서 수행 결과를 반환하는 방법이 있고,
초기화시, 그리고 종속 변수 값이 변경될 때 마다 변수 값을 다시 계산해두고 호출될 때는 단순히 계산 결과를 반환하기만 하도록 구성하는 방법이 있는데 
전자는 호출 오버헤드가, 후자는 메모리 오버헤드가 발생한다. 특별히 많이 호출되지 않는다면 전자로 짜는게 더 보기 좋은 듯.
Note ) ``kt lateinit``은 커스텀 접근자를 사용할 수 없으니 주의!


field : 커스텀 접근자에서 프로퍼티를 뒷받침하는 필드에 접근하기

```kt

class User (val name: String){

    var address: String = "unspecified"

        set(value: String) {

            println("""

                Address was changed for $name:

                "$field" -> "$value".""".trimIndent())

            field = value

        }

}

```

* 커스텀 접근자를 지정할 때 내부에서 ``kt field`` 키워드를 사용하지 않는다면 뒷받침 필드가 필요 없다는 의미 이므로 알아서 생성되지 않는다.


접근자 가시성 변경

```kt
class LengthCounter {
    var counter: Int = 0
        private set
}
```


data class custom getter

backing property를 사용한다.
```kt
data class Test(private val _value: Int) {
    val value
        get() = value
}
```