1. Lateinit
1) 사용하면, safe call을 쓰지 않을 수 있고
var로 선언된 Class의 Property에만 사용이 가능하다.
null을 불허한다.
class SampleA {
lateinit var name: String
init {
name = "Lionel"
}
fun process() {
name?.plus("messi")
print("이름의 길이 = ${name?.length}")
print("이름의 첫 글자 = ${name?.substring(0, 1)}")
}
}
2) 변수 초기화 여부 확인 문법
변수가 초기화 작업이 안 되어 있으면 변수를 썼을 때 문제가 되는데...
변수가 초기화가 됐는지 안 됐는지 확인하는 문법
text 변수 초기화 여부를 체크하는 속성. 되어 있으면 그대로 return함
class LateInitSample{
lateinit var text: String
fun getLateInitText(): String{
if(::text.isInitialized){
return text
}else{
return "기본값"
}
}
}
fun main(){
var lait = LateInitSample()
lait.text = "초기값"
println(lait.getLateInitText())
}
2. Lazy
1) 읽기 전용 변수인 val를 사용하는 지연 초기화 문법. 성능적인 문제를 고려함.
변수 선언: 메모리 할당 작업이 일어난다.
10만 줄 코드를 작성했을 때, 변수 선언하고 객체 생성한 첫줄에서 이미 memory를 할당하고 있는데
8000번 째 조건이 성립돼서 변수 사용한다. 이럴 때 memory를 미리 생성하고 갖고 있어야 하는지.
2) number 변수 접근 시 위의 구문 lazy 지연 초기화 작업 발생.
com 객체가 생성이 되면 Person2 객체 생성. person 객체 생성이 지연 초기화에 의하여 잠시 밀린 상태.
person.name 속성 접근이 시작될 때 지연된 초기화 작업이 발생됨.
fun main(){
val a: Int = 7
val number: Int by lazy {
println("코드를 시작합니다.")
7
}
println("코드를 시작합니다")
println(number)
println(number)
var com = Company()
com.process()
}
class Company{
val person: Person by lazy { Person() }
init {
}
fun process(){
println("${person.name}")
}
}
3) 주의 사항
지연 초기화는 최초 호출되는 시점에 초기화 작업이 일어남.
resource 발생이 크면 순간적으로 전체 성능에 영향을 줌.
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] Scope 함수 (0) | 2022.02.21 |
---|---|
[Kotlin] Generic, Null (0) | 2022.02.18 |
[Kotlin] 추상 Class (0) | 2022.02.17 |
[Kotlin] 상속과 확장 (0) | 2022.02.17 |
[Kotlin] 함수 (0) | 2022.02.17 |