자바에서는 field라는 용어를 주로 사용하지만, 코틀린에서는 프로퍼티라는 용어를 사용합니다.
프로퍼티 =
field(실제로 데이터가 저장되는 공간) +
getter(저장된 값을 읽을 때 호출되는 함수) +
setter(값을 저장하려고 할 때 호출되는 함수)
코틀린은 자바에서 field라고 불리는 클래스 내의 멤버 변수를 그냥 프로퍼티라고 부릅니다.
예시를 보며 설명해보도록 하겠습니다.
class Person {
var name: String = "링링"
}
위의 코틀린 코드를 디컴파일하면 아래와 같습니다.
public final class Person {
@NotNull
private String name = "링링";
@NotNull
public final String getName() {
return this.name;
}
public final void setName(@NotNull String var1) {
Intrinsics.checkNotNullParameter(var1, "<set-?>");
this.name = var1;
}
}
보시다시피 코틀린의 property를 선언하면 getter/setter 함수가 자동으로 생성됩니다.
(물론 따로 정의 가능 - 아래서 다시 보여드리겠습니다.)
즉, 코틀린의 property는 java의 field를 좀 더 사용하기 편하게 만든 변수입니다.
fun main() {
val person = Person()
println(person.name)
}
아무튼간에 코틀린에서는 위와 같이 get() 메소드를 호출하지 않고 직접 프로퍼티에 접근합니다.
(물론 decomplie 해보면 getName()을 호출하고 있겠죠?)
그렇다면 코틀린에서는 프로퍼티를 선언하면 무조건 getter setter가 생성되느냐?
class Person {
val name: String = "링링"
}
public final class Person {
@NotNull
private final String name = "링링";
@NotNull
public final String getName() {
return this.name;
}
}
눈치채셨을지 모르겠지만, val은 불변이기 때문에 setter가 자동생성되지 않습니다.
setter를 강제적으로 정의하려고 하면 오류가 발생합니다.
class Person(val name: String, age: Int) {
var age = age
get() = field
}
코틀린에도 위와 같이 field 가 존재하는데요, 이 field는 프로퍼티의 실제 값을 저장하는 변수를 의마하며 코틀린에서는 뒷받침하는 필드, Backing Field라고 부릅니다.

위의 이미지를 확인해보면 알겠지만 그냥 get에 field를 넣으면 중복 getter 라는 warning이 뜹니다.
그렇다면 이 field 키워드는 왜 필요할까요..?
바로 재귀를 막기 위함입니다.

마지막으로 custom getter/setter를 사용하면 다음과 같이 됩니다.
근데 저는 아직까지는 잘 사용하지 않는 것 같습니다. ㅎㅎ
class Person(val name: String, age: Int) {
var age = age
get() = field * 10
set(value) {
field = value * 10
}
}
fun main() {
val person = Person("링링", 10)
println(person.name + person.age.toString())
} // 출력 : 링링100