getter/setter를 직접 정의할 때 프로퍼티를 자기 자신으로 참조하면 무한 루프에 빠질 수 있음 → 이를 막기 위해 field라는 키워드를 사용class Person {
var name: String = "홍길동"
get() = field // name 프로퍼티의 실제 저장값 반환
set(value) {
field = value // name의 실제 저장값을 변경
}
}
field → 프로퍼티의 backing field를 의미getter에서 name을 직접 호출하면 getter가 무한히 호출됨 → 대신 field를 사용해야 함class Person {
var name: String = "홍길동"
get() = name // ❌ 잘못된 접근 → getter 재귀 호출
}
➡️ get() 안에서 다시 name을 호출하므로 무한 루프 발생
class Person {
var age: Int = 0
set(value) {
field = if (value < 0) 0 else value // 음수 방지 로직
}
}
fun main() {
val p = Person()
p.age = -5
println(p.age) // 0
}
field는 오직 프로퍼티 내부의 getter/setter 안에서만 사용 가능val은 setter가 없으므로 읽기 전용 backing field만 가짐custom getter만 정의하고 field를 쓰지 않으면 backing field 자체가 생성되지 않음 (즉, 계산된 값만 반환하는 프로퍼티로 동작)