[Kotlin] 코틀린 Property[backing property, backing field]
자바 클래스에서 필드를 생성하고 getter와 setter를 사용하여 외부에서
값을 가져오거나 변경할때 사용하였다.
코틀린에서 말하는 property는 자바에서의 필드, getter, setter를 모두 묶어 있는 것을 말한다.
자바에서 필드를 생성하는 것과 같은 방법으로 프로퍼티를 만들게 되지만 코틀린에서
자동으로 기본 getter, setter를 생성해 준다.
class A {
var a: Int = 0
}
위 코틀린 클래스를 자바 클래스로 변경해 주면 다음과 같은 결과를 확인할 수 있다.
public final class A {
private int a;
public final int getA() {
return this.a;
}
public final void setA(int var1) {
this.a = var1;
}
}
이렇게 필드는 private으로 지정되어 선언되고 getter와 setter가 만들어졌다.
프로퍼티의 값을 저장하기 위해 생성된 필드를 backing field라고 한다.
프로퍼티를 선언하면 getter와 setter가 자동 생성되지만 커스텀이 필요한 경우가 있을 수 있다.
그때는 다음과 같이 진행하면 된다.
class A {
var a: Int = 0
get() = field + 1
set(value) {
field = value + 1
}
}
위 자료에서 확인할 수 있는 field는 backing field를 말한다.
만약 위에서 a 프로퍼티의 backing field인 field를 사용하지 않고
class A {
var a: Int = 0
get() = a + 1
...
}
위와 같이 프로퍼티를 사용해준다면 자바로 작성했을때 다음의 코드를 작성한 것과 같다.
class A {
int a = 0
public int getA() {
return getA() + 1
}
...
}
마지막으로 프로퍼티를 작성했을때 setter, getter의 커스텀이 필요한 경우가 있을 수 있다.
아래의 예시를 보자.
class A {
var a = mutableListOf<Int>()
}
코틀린으로 위와 같이 작성했다면 MutableList getter는 MutableList 타입의 리턴을 할 것이다.
이때, ImmutableList의 리턴을 주고 싶다면 다음과 같이 작성하는 방법이 있다.
class A {
private var _a = mutableListOf<Int>()
var a: List<Int> = _a
}
이렇듯 ImmutableList 타입의 프로퍼티 a를 선언하고 본래 프로퍼티[_a]의 backing field를 setter를 통해 전달했다.
이렇게 커스텀 getter, setter의 필요성에 의해서
위 처럼 작성했을때 _a는 backing property라고 한다.
backing preperty는 보통 언더바['_']를 붙여준다.