기존의 자바에서는 프로퍼티(property) 선언시 필드(field) 값에 대한 getter()와 setter() 같은 접근자를 선언해주어야 했다. 하지만 코틀린에서는 프로퍼티 선언시 자동으로 접근자를 생성해주어, 개발자가 직접 접근자를 선언할 필요가 없어졌다.
하지만 프로퍼티 값을 그때그때 계산하거나 조작하여 얻어야 하는 상황이 있을 수 있다. 이 때 커스텀 접근자를 사용하면 된다.
‘커스텀 접근자’를 사용한다기보단, 말그 대로 접근자를 커스텀 하는 것..
변수 선언 이후, get(){...}
, set(value) {...}
을 통해 게터와 세터를 선언할 수 있다.
이때, 세터에서 value의 값을 쓰지 않으면 할당한 값은 무시되고 set()
내부의 코드만 실행 된다.
class Test{
private var a: Int = 1
get(){
println("getter")
return field
}
set(value){
println("setter")
field += value
}
fun printProperty() {
a = 1
println(a)
}
}
fun main() {
val test = Test()
test.printProperty()
}
// 출력
setter
getter
2
코틀린에서 field는 프로퍼티의 값을 저장하고 있는 메모리일 뿐이며, 접근자를 통해서만 사용될 수 있다.
접근자의 가시성은 기본적으로 프로퍼티의 가시성과 같다.
하지만 원한다면 set()
에 가시성 변경자를 추가하여 가시성을 변경할 수 있다.
class Test{
var a: Int = 1 // public
get(){
println("getter")
return field
}
private set(value){
println("setter")
field += value
}
}
fun main() {
val test = Test()
println(test.a)
test.a = 2 // Error
}
<aside> 💡 setter만 가시성 변경자를 변경 가능
getter의 가시성 변경자는 항상 프로퍼티와 동일해야 함
</aside>
대학생 시절 ‘게터와 세터 없이 직접 변수에 접근하여 값을 가져오고, 값을 수정하면 되지 않을까’라고 생각을 했었다. 하지만 이 생각은 근본부터 잘못되었다.
코틀린의 기본 가기성이 public
이기 때문에 생긴 오해이다. 클래스 내부에서 선언한 변수를 외부에서 직접 접근하는 것은 말도 안된다. OOP의 관점에서 볼 때, 객체의 밖으로 노출되는 것은 행동뿐이며, 상태는 철저히 캡슐화되어야 한다.
특수한 경우를 제외하곤 모든 변수와 내부에서만 쓰이는 메소드들은 private
이어야 하기 때문에 직접 접근은 애초에 불가능