개발 언어/코틀린
코틀린(Kotlin) | 클래스 - 프로퍼티(Property)
jjiiiinn
2019. 6. 24. 14:27
728x90
프로퍼티
- 자바에서는 필드의 개념으로 접근하지만 코틀린에서는 프로퍼티 개념으로 사용한다.
- 프로퍼티 = 필드 + 접근자
- 코틀린에서 접근자를 명시하지 않을경우 자동으로 생성해준다.
class Person {
val name = "park jin"
var age = 31
var isMarried = false
}
fun main() {
val person = Person()
println("person name is ${person.name}")
println("person age is ${person.age}")
println("person is married ${person.isMarried}")
}
커스텀 접근자
접근자에서 계산과 같은 동작을 해야한다면 직접 작성 가능하다.
var <프로퍼티이름>[ : 타입] [= <프로퍼티 초기값>]
[<getter>]
[<setter>]
class Person {
var name = "park jin"
get() = "my name is $field"
set(value) { field = value.toUpperCase() }
}
fun main() {
val person = Person()
person.name = "jin"
println(person.name) // my name is JIN
}
코틀린에서는 필드를 가질수 없음. 하지만 커스텀 접근자 사용시 field접근자를 통해 사용할 수 있으며 커스텀 접근자에서 field를 사용하지 않으면 생성하지 않는다.
class Person {
var wifeName: String? = null
val isMarried: Boolean
get() = this.wifeName != null // no backing field
}
lateinit
- 프로퍼티를 non null상태에서 초기화를 미룰수 있게 해준다. ex) 의존성 주입(DI)
- 다음과 같은 제약이 존재한다.
- var에서만 동작한다. - val은 선언과 동시에 초기화 함.
- 클래스 몸체, 최상위, 함수 내부에서 선언한 프로퍼티에서만 가능, 주 생성자에서는 사용불가.
- 커스텀 접근자를 선언하지 않아야한다.
- null허용에는 사용할 수 없다.
- 원시타입 프로퍼티에서는 사용 불가하다.
class Person {
lateinit var name: String
}
fun main() {
val person = Person()
//println("my name is ${person.name}") // error: lateinit property name has not been initialized
person.name = "park jin"
println("my name is ${person.name}") // my name is park jin
}
참조
https://kkangsnote.tistory.com/67
https://altongmon.tistory.com/586
728x90