코틀린에서 지정하는 기본 변수는 모두 null이 입력되지 않음
null 값을 입력하기 위해서 변수를 선언할 때 타입 뒤에 ?를 입력함
var variable: String?
fun nullParameter(str: String?) { // 함수 내부에서 null 체크를 한 뒤 str 사용 가능
if (str != null) {
var length2 = str.length
}
}
fun nullReturn(): String? {
}
Nullable인 변수 다음에 '?.'을 사용하면 해당 변수가 null일 경우 '?.' 다음의 메소드나 프로퍼티를 호출하지 않음
fun testSafeCall(str: String?): Int? {
// str이 null이면 length를 체크하지 않고 null을 반환함
var resultNull: Int? = str?.length
return resultNull
}
원본 변수가 null일 때 넘겨줄 기본값 설정
fun testElvis(str: String?): Int {
// length 오른쪽에 ?:를 사용하면 null일 경우 ?: 오른쪽의 값이 반환됨
var resultNonNull: Int = str?.length?:0
return resultNonNull
}
클래스 안에서 변수만 Nullable로 미리 선언하고 초기화는 나중에 해야할 경우 사용
class Person {
lateinit var name: String // String? = null
init {
name = "Lionel"
}
fun process() {
name.plus("Messi") // name?.plus("Messi")
print("이름 = ${name}") // ${name?}
}
}
읽기 전용 변수인 val을 사용하는 지연 초기화 (입력된 값을 변경할 수 없음)
val로 변수를 먼저 선언한 후 코드의 뒤쪽에 by lazy 키워드를 사용하면 됨
class Company {
var person: Person by lazy { Person() }
init {
// lazy는 선언 시에 초기화하기 때문에 초기화 과정이 필요 없음
}
fun process() {
print("person의 이름은 ${person.name}")
}
}
최초 호출되는 시점에 초기화 작업이 일어나기 때문에 초기화하는 데 사용하는 리소스가 너무 크면, 전체 처리 속도에 나쁜 영향을 미칠 수 있음
코드를 축약해서 표현할 수 있도록 도와주는 함수로, 영역 함수라고도 함
함수처럼 쓰지 않고 run, let처럼 괄호 없이 일종의 키워드 같이 사용함
자신의 함수 스코프 안에서 호출한 대상을 this와 it으로 대체해서 사용할 수 있음
var list = mutableListOf("Scope", "Function")
list.run {
val listSize = size // this.size
println("리스트의 길이 run = $listSize")
}
list.left {
val listSize = it.size
println("리스트의 길이 let = $listSize")
}
스코프 함수는 자신이 호출한 대상을 this 또는 it으로 대체해서 사용할 수 있음
this로 사용되는 스코프 함수 - run, apply, with
it으로 사용되는 스코프 함수 - let, also
호출 대상인 this 자체를 반환하는 스코프 함수 - apply, also
마지막 실행 코드를 반환하는 스코프 함수 - let, run, with
apply를 사용하면 스코프 함수 안에서 코드가 모두 완료된 후 자기 자신을 되돌려줌
var list = mutableListOf("Scope", "Function")
val afterApply = list.apply {
add("Apply")
count()
}
println("$afterApply"). // [Scope, Function, Apply]
// 마지막 코드인 count()와 상관없이 그냥 MutableList 자신을 돌려줌
var list = mutableListOf("Scope", "Function")
val lastCount = list.let {
it.add("Run")
it.count()
}
println("$lastCount"). // 3