코틀린 : Null Safety, 지연 초기화, 스코프 함수

mingsso·2023년 7월 2일
0

Java-Kotlin

목록 보기
17/17

Null Safety

null 값 허용하기 : ?

코틀린에서 지정하는 기본 변수는 모두 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 값 대체하기 : ?:

원본 변수가 null일 때 넘겨줄 기본값 설정

fun testElvis(str: String?): Int {
	// length 오른쪽에 ?:를 사용하면 null일 경우 ?: 오른쪽의 값이 반환됨
    var resultNonNull: Int = str?.length?:0
    return resultNonNull
}



지연 초기화

lateinit

클래스 안에서 변수만 Nullable로 미리 선언하고 초기화는 나중에 해야할 경우 사용

class Person {
	lateinit var name: String   // String? = null
    init {
    	name = "Lionel"
    }
    fun process() {
    	name.plus("Messi")    // name?.plus("Messi")
        print("이름 = ${name}")    // ${name?}
    }
}
  • var로 선언된 클래스의 프로퍼티에만 사용할 수 있음
  • null은 허용되지 않음 -> 변수가 초기화되지 않은 상황이 발생할 수 있다면 사용하면 안됨
  • 기본 자료형 Int, Long, Double, Float 등은 사용할 수 없음


lazy

읽기 전용 변수인 val을 사용하는 지연 초기화 (입력된 값을 변경할 수 없음)
val로 변수를 먼저 선언한 후 코드의 뒤쪽에 by lazy 키워드를 사용하면 됨

class Company {
	var person: Person by lazy { Person() }
    init {	
    	// lazy는 선언 시에 초기화하기 때문에 초기화 과정이 필요 없음
    }
    fun process() {
    	print("person의 이름은 ${person.name}")
    }
}


최초 호출되는 시점에 초기화 작업이 일어나기 때문에 초기화하는 데 사용하는 리소스가 너무 크면, 전체 처리 속도에 나쁜 영향을 미칠 수 있음



스코프 함수

코드를 축약해서 표현할 수 있도록 도와주는 함수로, 영역 함수라고도 함
함수처럼 쓰지 않고 run, let처럼 괄호 없이 일종의 키워드 같이 사용함

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 또는 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
profile
🐥👩‍💻💰

0개의 댓글