목차
- var과 val
- 프로퍼티 접근자 : get(), set()
- 참고 :
Kotlin Docs https://kotlinlang.org/docs/properties.html#getters-and-setters
Atomic Kotlin
var과 val
코틀린에는 변경가능한 var 프로퍼티와, 변경이 불가능한 val 프로퍼티가 있다.
var과 val 프로퍼티는 객체를 가리키는 참조이다.
var을 사용한 프로퍼티는 변수가 가리키던 대상을 바꿀 수 있지만, val로 선언된 프로퍼티는 새로운 대상을 참조할 수 없다.
val keyboard : String = "leopold"
keyboard = "logitec"
-> 에러. Kotlin: Val cannot be reassigned
프로퍼티는 멤버 함수에서 간단하게 프로퍼티 이름으로 호출할 수 있다.class cup {
val max = 100
fun isMax(add: Int) : Bool {
if (add < max) //프로퍼티 max를 단순히 이름으로 호출
return false
else return true
}
최상위 프로퍼티(전역 변수와 비슷한 역할)를 선언 할 수 있다. 하지만 var로 선언해 가변 프로퍼티로 만들면 프로그램이 복잡해질수록 상태를 추론하기 어려워 안티패턴으로 간주된다.val notebook : String = "M1" // 다른 클래스와 함수에서 참조가능한 프로퍼티가 됨
class Laptop
fun main(args: Array<String>) {}
프로퍼티 접근자 : get(), set()
get()은 해당 프로퍼티의 값에 접근할 때 호출되고, setter인 set()은 해당 프로퍼티의 값을 변경할 때 호출된다.get()과 set()을 따로 정의하지 않아도 알아서 만들어준다.class PropertyAccessor {
var initializer : Int = 1
}
위의 코드를 작성하면 실제로 실행되는 코드는 아래와 같다.
class PropertyAccessor {
var initializer : Int = 1
get() {
return field
}
set(value) {
field = value
}
}
* field는 코틀린의 backing property를 참조하는 식별자이다.
get(), set() 안에서만 사용되고, 프로퍼티의 값에 접근할 수 있다.
val로 선언된 프로퍼티는 값을 변경할 수 없기 때문에 get()만 만들어진다.val initializer : Int = 1
get() {
return field
}
set(value) {
field = value
}
-> 에러: Kotlin: A 'val'-property cannot have a setter
get()과 set()을 커스텀화해 사용할 수도 있다. 이 때 get()만 정의하거나 set()만 정의하는 것이 가능하며, 정의하는 순서는 상관없다.get()을 사용해서 프로퍼티의 초기값을 생략할 수 있다.class Rectangle(val width: Int, val height: Int) {
val area: Int
get() = this.width * this.height
}
get()에서 추론 가능하면 생략할 수 있다. val area get() = this.width * this.height
다음에 공부할 것