프로퍼티 = 필드 + 접근자
클래스 내부의 변수 선언은 자바에서는 필드 선언을 의미하지만 코틀린에서는 프로퍼티 선언을 의미한다. 즉, 필드 뿐만 아니라 접근자 메서드도 알아서 생성해준다.
```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
}
```
'Languages & Frameworks > Kotlin' 카테고리의 다른 글
[Kotlin] by : Decorator & Delegation (0) | 2017.12.02 |
---|---|
[Kotlin/Java] data : equals, hashCode, ... (0) | 2017.12.02 |
[Kotlin] 프로퍼티, 커스텀 접근자(getter, setter) (0) | 2017.12.02 |
[Kotlin] Class, 생성자 (0) | 2017.12.01 |
[Kotlin] enum / when / sealed (0) | 2017.12.01 |
[Kotlin/Java] Inner Class / Nested Class (0) | 2017.12.01 |