[코틀린기초] 26. getter 와 setter
코틀린에서는 프로퍼티만 선언해줘도 자동적으로 getter와 setter를 생성해준다.
단, 불변형인 val은 getter만 생성해준다.
getter, setter 지정하기
프로퍼티 밑에 탭을 한칸 넣고 getter와 setter를 지정할 수 있다.
field 를 사용하여 프로퍼티를 참조하는 변수로 사용한다. 안그러면 무한루프가 발생한다.
class user(_id: Int, _name: String, _age:Int){
val id: Int = _id
get() = field //여기에 id를 사용하게되면 계속 getter가 호출되어 무한루프가 발생!!!!
var name: String = _name
get() = field
set(value){ // value 말고 다른 거 써도 된다.
field = value
}
var age: Int = _age
get() = field
set(value){
field = value + 10 // 커스텀 세터
}
}
임시적인 보조 프로퍼티를 사용하여 구성할 수도 있다.
class user(_id: Int, _name: String, _age:Int){
val id: Int = _id
private var tempName:String? = null // 임시 프로퍼티
var name: String = _name
get(){
if(tempName == null) tempName = "NONAME"
return tempName ?: throw AssertionError(""Asserted by others)
}
set(value){
println("The name was changed")
field = value.toUpperCase() // 받은 인자를 대문자로 변경해 프로퍼티에 할당
}
var age: Int = _age
get() = field
set(value){
field = value + 10 // 커스텀 세터
}
}
프로퍼티 오버라이딩
부모의 프로퍼티가 val 인 것을 자식이 var로 오버라이딩 가능
그러나 반대의 경우는 불가능!!
open class First{
open val x : Int = 0 // 오버라이딩 가능
get(){
println("First x")
return field
}
val y : Int = 0 // open 키워드가 없어서 상속 불가
}
class Second : First(){
override var x: Int = 0 // 프로퍼티 오버라이딩
get(){
println("Second x") // getter가 오버라이딩되어 구현이 다르다
return field + 3
}
set(value){
field = value + 10
}
}
fun main(){
val second = Second()
println(second.x) // 오버라이딩된 x
println(second.y) // 부모로부터 상속받은 y
}