이 포스팅은 고돈호 님의 이것이 안드로이드다 with 코틀린(한빛미디어)을 기반으로 작성되었습니다.
코틀린은 지연 초기화를 사용한다. 이를 통해 앞서서 포스팅한 Nullable의 남용을 방지한다.
일반적으로 Nullable로 선언한 방법은 다음과 같다.
1.1 lateinit
class Phone {
var name: String? = null
init {
name = "iphone"
}
fun process() {
name?.plus("13 pro")
print("핸드폰 이름의 길이 = ${name?.length}")
print("모델명 = ${name?.substring(6, 6)}")
}
}
'?.' 때문에 가독성을 헤치는 경우가 생긴다. 따라서 lateinit를 사용하여 가독성을 향상한다.
class Phone {
lateinit var name: String
init {
name = "iphone"
}
fun process() {
name.plus("13 pro")
print("핸드폰 이름의 길이 = ${name.length}")
print("모델명 = ${name.substring(6, 6)}")
}
}
전체 예시 코드는 다음과 같다.
package kr.co.ki.function
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var p = Phone()
Log.d("nullable", "핸드폰 종류는 ${p.name} 입니다")
p.process()
}
}
class Phone {
var name: String? = null
init {
name = "iphone"
}
fun process() {
name = name?.plus("13 pro")
Log.d("nullable","핸드폰 이름의 길이 = ${name?.length}")
Log.d("nullable","모델명 = ${name?.substring(6, 12)}")
}
}
fun String.plus(word: String): String {
return this + word
}
1.2 lazy
lateinit과 다르게 읽기 전용 변수인 val을 사용하는 지연 초기화이다. 사용법은 다음과 같다.
class Company {
val person: Person by lazy{ Person() }
init {
// lazy는 선언시에 초기화를 진행하므로 별도의 초기화 과정 필요 X
}
fun process() {
print("person의 이름은 ${person.name}")
}
}
lazy는 선언 시에 초기화를 하기 때문에 별도의 초기화 과정이 필요 없다.
lazy로 선언된 변수가 최초 호출되는 시점이 by lazy {} 안에 넣은 값으로 초기화가 된다. 즉 위의 코드를 보면 company 클래스가 초기화되더라도 person에 바로 Person()로 초기화되지 않고 process 메서드에서 person.name 이 호출되는 순간 초기화된다.
'안드로이드 앱 개발' 카테고리의 다른 글
8. 코틀린의 null (0) | 2021.12.23 |
---|---|
7. 클래스 (0) | 2021.12.21 |
6. 함수 (0) | 2021.12.20 |
5. 반복문 (0) | 2021.12.19 |
4. 배열과 컬렉션 (0) | 2021.12.14 |